まつもと ゆきひろです

In message "[ruby-list:20775] strange matching against EUC code"
    on 00/02/16, YANAGAWA Kazuhisa <kjana / os.xaxon.ne.jp> writes:

|    > ruby <<EOS
|    p /[^\x00-\x7f]{2}/ =~ "あ"
|    p /[\x80-\xff]{2}/ =~ "あ"
|    p /[^\x00-\x7f]{2}/n =~ "あ"
|    p /[\x80-\xff]{2}/n =~ "あ"
|    EOS
|    nil
|    0
|    0
|    0
|
|っていう挙動はかなり読みづらいと思うのですが,いかなる現象が働いている
|のでしょう? 後ろ二つはわざわざ `n' をつけてバイト列としてマッチさせて
|いるのでマッチするのは当然なのですが,前二つが違う結果を与えるのがわか
|らない.
|
|両方マッチするか,どちらもマッチしないかですよね.期待するのはマッチす
|ることですけど.

うーん、[^\x00-\x7f] は「あ」1文字にマッチしてしまうからです。
2文字目が無いので失敗するわけですね。

一方、[\x80-\xff]は「あ」にはマッチしないので、「あ」の前半
にマッチして、次の後半に進むわけですね。