Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

鬼車の文字列集合オプションをつかって、alnumが日本語を拾う怪挙動を抑制する

鬼車の文字列集合オプションはascii、unicodeとマッチパターンを切り替えできます。
これを活かすと、alnumが日本語を拾うという、怪挙動を抑制する事ができます

実際のところ

まず何もしない場合。almum……つまり0-9a-zA-Zだけにマッチすべきところ、
漢字も拾ってしまっています

"漢字".match(/[[:alnum:]]+/)'
#<MatchData "漢字">

ここで文字列集合オプション。
正規表現パターン全体を囲って記述する点に注意
まずascii

p "漢字".match(/(?a:[[:alnum:]]+)/)'
# nil

次にunicode

p "漢字".match(/(?u:[[:alnum:]]+)/)'
# nil

デフォルトの挙動を使いたい場合はd

p "漢字".match(/(?d:[[:alnum:]]+)/)'
#<MatchData "漢字">

詳しい話

鬼車の公式docによると
各オプションの挙動は以下の通り

                     文字集合オプション (文字範囲オプション)
                      d: デフォルト (Ruby 1.9.3 互換)
                         \w, \d, \s は、非ASCII文字にマッチしない。
                         \b, \B, POSIXブラケットは、各エンコーディングの
                         ルールに従う。
                      a: ASCII
                         ONIG_OPTION_ASCII_RANGEオプションがオンになる。
                         \w, \d, \s, POSIXブラケットは、非ASCII文字に
                         マッチしない。
                         \b, \B は、ASCIIのルールに従う。
                      u: Unicode
                         ONIG_OPTION_ASCII_RANGEオプションがオフになる。
                         \w (\W), \d (\D), \s (\S), \b (\B), POSIXブラケット
                         は、各エンコーディングのルールに従う。