.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/を使ったことがない。
*1:参照先ドキュメント中ではECMAScriptだが、ここでは分かりやすさのためJavaScriptとする
*2:"_"を含めたくない場合も多いだろう