0

私の現在のコードは次のとおりです。

const string st = "one two";
const string reg = "((?<first>one ))?(?=(?<second>two))";
var result = Regex.Matches(st, reg, RegexOptions.IgnoreCase);

Console.WriteLn(result.Count);

foreach (Match match in result)
{
    Console.WriteLine("first={0}, second={1}", match.Groups["first"], match.Groups["second"]);
}

出力は次のとおりです。

2
first=one , second=two
first=, second=two

2 つの一致を返します。

正規表現を記述して 1 つの一致のみを返すにはどうすればよいですか?

4

1 に答える 1

2

これは、最初のグループをオプションにするためです。最初のグループの 1 セットのブラケットを削除できます。

  1. したがって、正規表現は「1」に一致し、次の「2」に先読みします(そして、それをキャプチャグループにも保存します)。

  2. 次に、最初のものはオプションであるため、2回目は「2」の前の空の文字列と一致し、次の「2」を先読みします(これもキャプチャグループに保存します)

それをキャプチャするときに、なぜ先読みが必要なのですか?

何を達成しようとしているのかを説明する必要があります。

あなたの質問に答えてみてください:

一致を 1 つだけ取得するには、最初のグループをオプションではなくします。

const string reg = "(?<first>one )(?=(?<second>two))";

または先読みを削除します。

const string reg = "(?<first>one )?(?<second>two)";

これは、「one two」がある場合、最初の一致として一致することを意味します。最初のグループに ==> "two" がない場合、2 番目のグループにのみ一致します。

先頭にアンカーを追加するとどうなりますか?

const string reg = "^(?<first>one )?(?=(?<second>two))";

^は文字列の先頭に一致するため、最初の単語が使用可能な場合、2 番目の単語の前に 2 回一致するべきではありません。

于 2012-08-09T11:09:56.790 に答える