この記事は公開から4年以上経過しています。
.NETで10進数値の判定を行なう際に正規表現[0-9]
ではなく\d
を用いる場合に他の開発言語の正規表現仕様と混同しがちなので備忘録。
結論
.NETの正規表現の既定設定では"\d"は半角10進数値だけでなく全角10進数値にもマッチする。
理由
以下Microsoft Docsからの抜粋。
文字クラス
文字クラス | 説明 | パターン | 一致条件 |
---|---|---|---|
\d | 10 進数字と一致します。 | \d | 『"4 = IV"』の「"4"」 |
とあることから一見JavaScriptやPHPの正規表現と同じ感覚で半角の10進数判定として使えそうだが、別のページの説明に
10 進数字: \d
\d は、10 進数字と一致します。 標準の 10 進数 0 ~ 9 およびその他の各種文字セットの 10 進数を含む \p{Nd} 正規表現パターンと同じ結果をもたらします。
ECMAScript 準拠の動作が指定された場合、\d は [0-9] と同じになります。 ECMAScript 正規表現の詳細については、「正規表現のオプション」の「ECMAScript 一致の動作」のセクションを参照してください。
と記載がある。更に別のページには
ECMAScript 一致の動作
既定では、正規表現パターンを入力テキストに照合するときに、正規表現エンジンは標準の動作を使用します。 ただし、RegexOptions.ECMAScript オプションを使用することで、ECMAScript 一致の動作を使用するように正規表現エンジンに指示できます。(!) 注意
ECMAScript 準拠の動作を使用するには、RegexOptions.ECMAScript 値を options クラス コンストラクターまたは静的パターン一致メソッドの Regex パラメーターに渡す必要があります。 インライン オプションとしては使用できません。
と記載されていることから分かるとおり、デフォルト設定では[0-9]
≠\d
となるため注意が必要。
ちなみに正規表現をECMAScriptに準拠させる場合には
var regEx = new Regex(@"\d+", RegexOptions.ECMAScript);
のように、RegExの初期化時にRegexOptions.ECMAScript
オプションの指定を行なう。
参考ウェブサイトなど
-
Microsoft Docs
正規表現言語 – クイック リファレンス -
Microsoft Docs
正規表現での文字クラス -
Microsoft Docs
正規表現のオプション
以上です。