atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します

.NETの正規表現は国際化対応(?)している

はじめに

.NETの正規表現MSDN]の正規表現が、国際化対応か何か良く分からないが、私にとっては少し意外な動作をすることを発見した。その動作を記録し、私なりのルールを示す。

なお、以降の記述では、正規表現のパターンを示す場合、/<パターン>/のように記述する。

意外な動作

今回私にとって意外だった動作は、/\d/が全角数字にマッチすることだった。念のため説明しておくと、/\d/は10進数字を表す文字クラスだ。例えば/\d{4}/。このパターンが"1983"(半角)にマッチするのは当然だが、他に"1983"(全角)にもマッチする。

この仕様、文字クラスについてのドキュメントMSDN]を見ると、確かに明記されている(のだろう)。しかしながら、参照先の記述を見ても、私には理解できなかった。正規表現に詳しい人なら理解できるのだろうが…。

気になったので、少しテストしてみた。以下にその結果を示す。機種依存文字があるので注意。

/\d/にマッチする文字
  • 1(半角)
  • 1(全角)
/\d/にマッチしない文字
  • ?(ローマ数字1大文字。化けるか…)
  • 〓(ローマ数字1小文字。化けるか…)
/\w/にマッチする文字
  • a(半角)
  • a(全角)
  • A(半角)
  • A(全角)
/\w/にマッチしない文字

/\w/にマッチしない文字は、今回テストした中にはなかった。当然空白文字などがマッチしない。しかし、そういった、テストしなくても結果が分かる文字を除くと、マッチしなさそうな文字の中には、実際にマッチしない文字がなかった。

JavaScriptとの違い

前述の文字クラスについてのドキュメント中に少し記述があるが、JavaScript*1は.NETと動作が異なる。例えばJavaScriptでは、/\d/は全角数字にマッチしない。JavaScript正規表現は、基本的にはASCII文字ベースだと思われる。

ルール

私なりのルールだが、/\d/や/\w/といった名前付きの文字クラスは、今後プログラムでは使用しない。大抵のプログラムでは、/\d/は/[0-9]/に、/\w/は/[a-zA-Z_0-9]/に*2置き換えられるはずだからだ。そもそも、私は今までプログラムで、/\w/を使ったことがない。

理由

/\d/が全角数字にマッチすることに依存するソースコードなど、私の基準では読みにくくて仕方がない。せっかく正規表現というプログラミング言語に(ほぼ)依存しない言語を使っているのに、プログラミング言語依存の部分を使うのは、避けるべきだろう。

*1:参照先ドキュメント中ではECMAScriptだが、ここでは分かりやすさのためJavaScriptとする

*2:"_"を含めたくない場合も多いだろう