2020年03月09日

C言語の正規表現で [0-9] (全角)は役に立たない

あるプログラムにバグレポート送ろうとしたら言語の限界だったという話。 ちなみにCはビルドしかしたことないです。

問題

全角数字で構成された正規表現 [0-5] (角括弧、ブラケット) と (0\|1\|2\|3\|4\|5) (丸括弧、パーレン)でマッチする結果が違う。

ブラケットの方が無関係な行、数字がまったく含まれていないところにもヒットする。

原因

C言語でのマルチバイト文字の扱いによる。

たとえば全角の1は U+ff11 \xef\xbc\x91 なのだが、 C の std::regex_match では [1] が「\xef\xbc\x91」という意味になってしまう。

すると少(U+5c11, e5 b0 91) や 䑄 (U+4444, e4 91 84 )にもマッチするという、わけのわからない結果が生まれる。

解決策としては標準関数ではなく Unicode 対応のライブラリを使うといいらしい。

posted by かぷらす at 08:35| Comment(0) | 調査 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください