Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

鬼車の文字列集合オプションをつかって、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ブラケット
                         は、各エンコーディングのルールに従う。