次のコードは、4 ではなく 2 を評価します。
Regex.Matches("020202020", "020").Count;
正規表現は、前の試合の終わりから次の試合を探し始めると思います。これを防ぐ方法はありますか。「0」と「2」の文字列があり、「2」が 3 つ連続した回数、「2」が 4 回連続した回数などを数えようとしています。
これは4
期待どおりに返されます。
Regex.Matches("020202020", @"0(?=20)").Count;
先読みは を消費せずに と一致するため、次の一致試行は最初の の次の位置から開始されます。先読みとして正規表現全体を実行することもできます。20
0
Regex.Matches("020202020", @"(?=020)").Count;
正規表現エンジンは、長さがゼロの一致を作成するたびに、自動的に 1 つ先の位置にバンプします。したがって、3 つ2
または 4 つのすべての実行を見つける2
には、次のように使用できます。
Regex.Matches("22222222", @"(?=222)").Count; // 6
...と:
Regex.Matches("22222222", @"(?=2222)").Count; // 5
編集:2
あなたの質問をもう一度見てみると、あなたが探しているかもしれないことが起こり0
ます
Regex.Matches("020202020", @"(?=20202)").Count; // 2
がいくつあるかわからない場合は0
、これを使用できます。
Regex.Matches("020202020", @"(?=20*20*2)").Count; // 2
そしてもちろん、量指定子を使用して正規表現の繰り返しを減らすことができます。
Regex.Matches("020202020", @"(?=2(?:0*2){2})").Count; // 2
実際、最後の正規表現が終了したところから正規表現が続きます。これは、先読みパターンを使用して回避できます。私は .NET の専門家ではありませんが、これを試してみてください:"(?=020)."
翻訳: "この文字と次の 2 文字が020
". トリックは、一致が 3 文字ではなく 1 文字だけであるため、文字列が重複していても、文字列内のすべての一致を取得することです。
( のように書くこともできますが"0(?=20)"
、少なくとも人間にはわかりません :p )
ゼロ幅の正の後読みを使用して、これを試してください。
Regex.Matches("020202020",@"(?<=020)").Count;
私のために働いた、4つの試合が得られます。
Regex に関する私のお気に入りのリファレンス:正規表現言語 - クイック リファレンス Regex を試す簡単な方法でもあります。複雑な Regex でよく使用します: Free Regular Expression Designer
2
実際に連続した -sのシーケンスを探していると仮定すると、先読みをまったく使用しない別のオプションがあります。0
(これは、とのパターンを探す任意のシーケンスでは機能しません2
。)
3 つ以上の2
-s の重複しないシーケンスの出現をすべて列挙し (どのように?)、短いサブシーケンスの数を推測します。
たとえば、6 つの連続した - のシーケンスと2
5 つの連続した -のシーケンスが 1 つ見つかった場合2
、(6-3+1) + (5-3+1) = ? が必要であることがわかります。3 つの連続2
する -s (重複する可能性がある) のシーケンスなど:
0002222220000002222200
222
222
222
222
222
222
222
大きな文字列の場合、これは先読みを使用するよりもいくらか高速です。
ソースには、正規表現パターンが一致する 2 つの「020」パターンが含まれているためです。ソースを次のように変更してみてください。
Regex.Matches("020202020", "02").Count;
これで 02 が連続して一致し、今度は 4 つ取得されます。