0

次のような単純な RegExと、期待どおりにyieldsの置換を使用し^(\d+\D+\d+)(.*)て解析する文字列が与えられます。 15-APR-2012 @ 11:00:00[$1]$2[15-APR-2012] @ 11:00:00

私の問題は、これで Regex.Matches を呼び出すときに、インデックス 0 で 1 つの一致を受け取り、string: 全体15-APR-2012 @ 11:00:00が一致として表示されることです。しかし、実際には2試合あります。両方のマッチを取得するにはどうすればよいですか? インデックス 0 とインデックス 12 が表示されるはずです。使用しているコードは、別の SO スレッドからのものです。

// Get a collection of matches.
MatchCollection matches = Regex.Matches(inPutString, regexptrn);
foreach (Match match in matches)
{
    foreach (Capture capture in match.Captures)
        {
            retVal += String.Format("Index={0}, Value={1}", capture.Index, capture.Value) + Environment.NewLine;
        }
}

.Matches() が実際に何をするかについて間違った考えを持っていますか?


わかった。これはフォローアップの同じ文字列です。新しい正規表現「(..)(...)」を [$1]{$2} に置き換えると、[10]{-AU}[G-]{201}[2 ]{@ になります。 1}[1:]{45:}38 私たちはこれを期待しています。

ただし、一致すると次のようになります。

Index=0, Value=10-AU
Index=5, Value=G-201 
Index=10, Value=2 @ 1 
Index=15, Value=1:45: 

これは、Matches がそのグループではなくパターン全体を見ていることを示しています。グループマッチを取得する方法

4

1 に答える 1

1

現在の正規表現が複数の一致を取得できない理由は 2 つあります。

  • 正規表現の^先頭は文字列の先頭へのアンカーであるため、これを削除する必要があります。そうしないと、正規表現はインデックス 0 でのみ一致します。
  • 正規表現の.*最後の は文字列の残りの部分と一致し、重複する一致は見つからないため、一致できるのは 1 回だけです。いずれにせよ、2 番目のキャプチャ グループでは何もしていないので、おそらくこれを正規表現から削除できます。

...正規表現を使用して、(\d+\D+\d+)一致を に置き換えてみてください[$1]

于 2012-09-21T21:10:15.950 に答える