Onigmoで [\x{XXXX}-\x{XXXX}]で検索時、範囲外の文字がヒットする。

投稿者: 星くず彼方に3 声5 投稿

開発お疲れ様です。 EmEditor x64 v16.1.3を使ってて不具合らしきものがあります。 7bitASCII文字で表現できない文字を検索するため、正規表現を使用するにチェックを付けた状態で、 [\x{0080}-\x{ffff}] というパターンで検索すると、 Boost.Regex では、期待した動作になりますが、 Onigmo だと、K(U+004B) S(U+0053) k(U+006B) s(U+0073) にもヒットしてしまうようです。 では確認お願いします。
興味深いですね。 「大文字と小文字を区別する」が ON だとこの現象は起こらないようです。 なお,非 ASCII 文字の検出は \P{ASCII} でできます。 [\x{0080}-\x{ffff}] だと基本多言語面(BMP)外の文字にマッチしません。
理由が分かりました。 結論から言えば,case insensitive(大文字・小文字を区別しない)における Onigmo の動作の仕様といっていいと思います。 Ruby などで実験しても同じです。 case insensitive のとき,U+017F LATIN SMALL LETTER LONG S という文字が「s」や「S」にマッチします。 この文字はラテン文字の小文字の普通のエス「s」のいわば異体字で,日本語でも「ロングエス」と言います。音価なども同じ。対応する大文字は普通の「S」です。 写本や初期の活版印刷で使われていました。 試しに検索ダイアログに \x{014F} を入れて,大文字・小文字を区別しない,で検索してみてください。「s」や「S」にマッチしますね。 [\x{0080}-\x{FFFF}] の範囲にこのロングエスが含まれているために,「s」「S」にマッチしたんですね。 一方,U+212A KELVIN SIGN という記号があります。これは温度のケルビン記号なのですが,既存コードとの互換性のために用意された文字であり,ふつうはケルビンの記号にはこれでなく普通のラテン文字の「K」を使うことが推奨されています。 これも,case insensitive の場合はふつうの「k」「K」にマッチするんですね。
redakt55 様 いつもお世話になっております。江村です。 調べていただき、ありがとうございました。 参考になりました。
詳細な解説、ありがとうございました。

このトピックの投稿: 5