Ruby で平仮名にマッチする正規表現
Ruby 1.8 系で平仮名にマッチする正規表現を書きたい。
正規表現で Unicode ブロックが使えれば楽なのだが、残念ながら Ruby 1.8 ではサポートされていない。
鬼車
ちなみに 1.9 で搭載される予定の鬼車では、以下のような形式で Unicode ブロックやカテゴリを指定できるようだ(参考:鬼車 正規表現 Version 5.6.0)。
\p{property-name}
\p{^property-name}
(否定)\P{property-name}
(否定)
もっとも、実際に試したわけではないので、現状の Ruby 1.9 で上記のような使い方ができるのかは分からない。
Ruby 1.8
結局、Ruby 1.8 では平仮名に相当するコードポイントの範囲を直接、正規表現で指定してやるのが簡単そうだ。
Unicode Character Database の Block.txt によると平仮名(Hiragana
)の範囲は 0x3040
から 0x309f
なので、Ruby リファレンスマニュアルの FAQ「10.7 SJISの機種依存コード84BF から 889Fまでを空白に置き換えたいのですが」を参考に正規表現を書いてみる(ただし、UTF-8 限定)。
/#{"[#{[0x3040].pack('U')}-#{[0x309f].pack('U')}]"}/u
コードポイントから UTF-8 リテラル文字列への変換に Array#pack
を利用しているため読みづらくなっている。もっといい方法があるのかもしれない。