質問

この問題への答えを見つけることができないようで、問題が存在するかどうか疑問に思っています。簡単な例:

文字列" nnnn"を検討します。ここで" nn"のすべての一致を検索します。 -しかし、互いに重複するものも。したがって、正規表現は次の3つの一致を提供します。

  1. nn nn
  2. n nn n
  3. nn nn

これは正確には正規表現の目的ではありませんが、実際には文字列ではなくパターンを使用して一致を行う必要があることを考えると、文字列を歩いてこれを手動で解析することは非常に多くのコードのようです。

役に立ちましたか?

解決

可能な解決策は、ポジティブルックビハインドを使用することです。

>
(?<=n)n

次の終了位置が表示されます:

  1. * n *** n ** nn &nbsp;
  2. n * n *** n ** n &nbsp;
  3. nn * n *** n **

Timothy Khouri が言及したように、ポジティブルックアヘッドはより直感的です

私は彼の命題(?= nn)n をよりシンプルな形式にしたいと思います:

(n)(?=(n))

これは、必要な文字列の最初の位置を参照し、グループ(2)の2番目のn をキャプチャします。

その理由は次のとおりです。

  • lookahead内では、任意の有効な正規表現を使用できます。
  • キャプチャ括弧が含まれている場合、後方参照は保存されます

したがって、group(1)とgroup(2)は、 'n'が表すものをキャプチャします(複雑な正規表現であっても)。

他のヒント

キャプチャグループで先読みを使用すると、正規表現が遅くなり複雑になりますが、機能します。別の解決策は、Regex.Match()メソッドに次の一致試行を開始する場所を指示することです。これを試してください:

Regex regexObj = new Regex("nn");
Match matchObj = regexObj.Match(subjectString);
while (matchObj.Success) {
    matchObj = regexObj.Match(subjectString, matchObj.Index + 1); 
}

AFAIK、これを一度に行う純粋な正規表現の方法はありません(つまり、ループなしで要求した3つのキャプチャを返す)。

これで、パターンを1回見つけることができ、offset(見つかった位置+ 1)で始まる検索をループできます。正規表現の使用と単純なコードを組み合わせる必要があります。

[編集]素晴らしい、基本的にJanが示したことを言ったとき、私は落胆した...
[編集2]明確にするために:ヤンの答えはより良いです。より正確ではありませんが、確かに詳細であるため、選択するに値します。私はまだ何も間違っていないので、なぜ私のものがダウン投票されているのか理解していません。大したことではなく、単に迷惑です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top