重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

正規表現で数字をメタ文字に置換えると結果が異なる理由が分かりません。

現在、正規表現でチェックするコードがあります。
この正規表現中の数字「9」を「\d」に置換えました。

 置換え前)  置換え後)
  9([x]c+)*&  \d([x]c+)*&

VisualStudio2008のC#にて実装し、文字列「9xc1&」で
テストすると結果が異なりました。
(Regexクラスのオプションはデフォルトのまま)

Regex.IsMatch("9xc1&", @"9([x]c+)*&") == false
Regex.IsMatch("9xc1&", @"\d([x]c+)*&") == true

置換え前が正しいと思うのですが、メタ文字に置換えると
グループやアスタリスクの影響を受けるのでしょうか?

アドバイスをお願い致します。

A 回答 (2件)

\dは9と同じではなく、[0-9]と同じです。



マッチの流れはこんな感じになるのではないでしょうか?

1.正規表現\dが9にマッチする。
2.正規表現([x]c+)*がxcにマッチする。
3.正規表現&がマッチ失敗となる。
4.正規表現([x]c+)*がマッチをあきらめる。
5.再び、正規表現&が、マッチを試みるがマッチ失敗となる。

まだ、未調査のテキストがある為、正規表現は続く。

6.今度は、正規表現\dが1にマッチする。
7.正規表現([x]c+)*がマッチを試みるがマッチ失敗となり、マッチをあきらめる。
8.正規表現&がマッチに成功し、全体としてマッチが成功する。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

テキストの先頭からマッチを進めて、未調査テキストがある限り
パターンマッチを最初から繰り返し続けるということですね。

新たにテスト文字列のバリエーションを増やして実行したところ、
「9xc^%2&」もtrueとなってしまいました。

ご回答の通り、ハットパーセントまで読み捨てて
「2&」で一致すると考えると納得いきます。

数日間ずっと考えていましたが、とりあえず整理つきました。
この度はありがとうございました。

お礼日時:2010/09/25 17:11

\dは9を指すのではなく、1を指すのだとしたら?



1&は

\dのあとに、([x]c+)が0個続いて、

最後に &

ですよね?

この回答への補足

ご回答ありがとうございます。
1点確認させてください。
入力値に"xc"が登場しているため、アスタリスクの内容を1回だけ必ず解釈され、それによって"\d&"は一致しないと考えていました。
そうではなくアスタリスクの内容は0回と1回の両方が解釈されるということでしょうか?

補足日時:2010/09/24 12:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!