1

次のテキストがあります。

「ねこ・いぬ・ねずみ・ライオン」

そして、正規表現を使用して「犬」または「マウス」を検索します。

Regex regex = new Regex(@"dog|mouse");

C# の Regex の動作は、最初に単語 dog を最後まで検索することです。一致が見つかった場合は停止します。正規表現で自分の単語の最初の出現を見つけた後に停止するにはどうすればよいですか? これは最初に発生するため、「猫」の後に停止することを意味します。

複数の正規表現検索を行い、検索結果のインデックスを照合する必要がありますか? または、正規表現で指定することはできますか?

4

2 に答える 2

0

これを行う方法は、dotall オプションで遅延量指定子を使用することです。

Regex regex = new Regex(@"^.*?\b(?>dog|mouse)\b");

別の方法はそれを行うことです。

Regex regex = new Regex(@"^(?>[^dm]*+|d++(?!og\b)|m++(?!ouse\b))*\b(?>dog|mouse)\b");

より長くなりますが、より効率的です。アイデアは、各文字をテストして次の内容を確認するため、遅い遅延量指定子を回避することです。ここで、私は冒頭を「adまたは a または ormではないものすべてのd後に or が続かないものogまたはm後にouse0 回以上続かないものすべて.

(?>..)アトミック グループです。これは、正規表現エンジンがバックトラックするのを避けるためです。これは一種の「オール オア ナッシング」です。詳細については、こちらを参照してください。

++バックトラックも回避する所有量指定子です。

于 2013-06-13T11:14:49.513 に答える