5.5 です。

(13/06/09 10:21), Nakamatsu Shinji wrote:
> 正規表現における文字クラス[:alpha:]のマルチバイトキャラクタに対する挙動について教えていただきたいのですが、
> 
> "ほげ".match(/[[:alpha:]+]/)
> 
> が、"ほげ"にマッチしてしまう挙動となっていますが、これは正しい動作なのでしょうか?

Unicode だとそうなります。
※えっと,正規表現は /[[:alpha:]+]/ じゃなくて /[[:alpha:]]+/ で
しょうか。

試しに CP932(Windows-31J)でやってみてください。この場合は仮名に
マッチしません。

で,こういう仕様をどこで確認するかですが,公式リファレンスマニュ
アルの正規表現のページ
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fregexp.html
は Ruby 1.9 以上に対応していませんので,参考にできません。

最も近いのは,「鬼車 正規表現」のページ
http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt
ではないかと思います。

今回の件については,このページに書いてあるとおりなのだろうと思い
ます。
つまり,「6. 文字集合」の「POSIXブラケット」のところを見ると,
Unicode 以外の場合は [:alpha:] は「英字」とあります。だから英字
でない漢字・仮名はマッチしません。
一方,Unicode の場合は Letter | Mark とあります。
この Letter とか Mark というのは,Unicode の「一般カテゴリー」と
いうものらしいです。
ここを見てください:
http://www.unicode.org/reports/tr44/#General_Category_Values

Unicode の各文字はいろんなプロパティーを持っていますが,そのうち,
一般カテゴリーというプロパティーがあります。
Letter とか Mark というのはそいつの値であるようです。

では Letter とは具体的に何か?
上記 URL の Table 12. General_Category Values を見てみましょう。
Letter は Lu | Ll | Lt | Lm | Lo とあります。
Lu というのは,uppercase な Letter つまり,大文字のこと。
Ll は小文字(lowercase な Letter),などといった具合です。
最後の Lo はその他(other)の Letter ということです。
Lo が具体的に何か,も Table 12 に書いてあります。
つまり「other letters, including syllables and ideographs」とあり
ます。
ここで,音節文字とか表意文字を含むことが分かりますね。仮名・漢字
を含むことがこれで分かりました。

以上で一応解決したと思います。


しかし,Ruby の正規表現は果たして上記の鬼車のページに書かれてある
とおりなのかという問題があります。

答えは否。
Ruby 1.9 は鬼車を採用していますが,その仕様は若干違うんです。
たとえば,\d は鬼車の上記の仕様では全角数字を含みます。
それどころか,
http://www.fileformat.info/info/unicode/category/Nd/list.htm
に挙っているような極めて多様な十進数字にマッチします。
しかし,Ruby 1.9, 2.0 の \d は [0-9] と等価です。

また,Unicode のコード番号で文字を指定する書式は,鬼車の上記の仕様
では \x{ } ですが,Ruby 1.9, 2.0 では \u{ } です。

違いがこの二つ以外にあるのかどうか,私は知りません。
どなたか教えてください。
公式リファレンスマニュアルの編集にも支障を来しています。

Ruby 2.0 では,鬼車に代わって鬼雲が採用されました。
ありがたいことに,鬼雲の日本語マニュル
https://github.com/k-takata/Onigmo/blob/master/doc/RE.ja
は鬼車の上記ページとまったく同じ形式で書かれているので,差分を取れ
ばどこが違っているのか分かります。

-- 
5.5 / moji.gr.jp