9

次のコードは、4 ではなく 2 を評価します。

Regex.Matches("020202020", "020").Count;

正規表現は、前の試合の終わりから次の試合を探し始めると思います。これを防ぐ方法はありますか。「0」と「2」の文字列があり、「2」が 3 つ連続した回数、「2」が 4 回連続した回数などを数えようとしています。

4

5 に答える 5

10

これは4期待どおりに返されます。

Regex.Matches("020202020", @"0(?=20)").Count;

先読みは を消費せずに と一致するため、次の一致試行は最初の の次の位置から開始されます。先読みとして正規表現全体を実行することもできます。200

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
于 2012-08-13T22:24:00.230 に答える
4

実際、最後の正規表現が終了したところから正規表現が続きます。これは、先読みパターンを使用して回避できます。私は .NET の専門家ではありませんが、これを試してみてください:"(?=020)."翻訳: "この文字と次の 2 文字が020". トリックは、一致が 3 文字ではなく 1 文字だけであるため、文字列が重複していても、文字列内のすべての一致を取得することです。

( のように書くこともできますが"0(?=20)"、少なくとも人間にはわかりません :p )

于 2012-08-13T22:15:49.843 に答える
1

ゼロ幅の正の後読みを使用して、これを試してください。

Regex.Matches("020202020",@"(?<=020)").Count;

私のために働いた、4つの試合が得られます。

Regex に関する私のお気に入りのリファレンス:正規表現言語 - クイック リファレンス Regex を試す簡単な方法でもあります。複雑な Regex でよく使用します: Free Regular Expression Designer

于 2012-08-13T22:22:34.987 に答える
0

2実際に連続した -sのシーケンスを探していると仮定すると、先読みをまったく使用しない別のオプションがあります。0(これは、とのパターンを探す任意のシーケンスでは機能しません2。)

3 つ以上の2-s の重複しないシーケンスの出現をすべて列挙し (どのように?)、短いサブシーケンスの数を推測します。

たとえば、6 つの連続した - のシーケンスと25 つの連続した -のシーケンスが 1 つ見つかった場合2、(6-3+1) + (5-3+1) = ? が必要であることがわかります。3 つの連続2する -s (重複する可能性がある) のシーケンスなど:

0002222220000002222200
   222
    222
     222
      222
               222
                222
                 222

大きな文字列の場合、これは先読みを使用するよりもいくらか高速です。

于 2012-08-13T22:21:03.713 に答える
-4

ソースには、正規表現パターンが一致する 2 つの「020」パターンが含まれているためです。ソースを次のように変更してみてください。

Regex.Matches("020202020", "02").Count;

これで 02 が連続して一致し、今度は 4 つ取得されます。

于 2012-08-13T22:21:48.657 に答える