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

返回两个匹配项。

如何编写正则表达式以仅返回一个匹配项?

4

1 回答 1

2

这是因为你让你的第一组是可选的,顺便说一句。您可以删除第一组的一组括号。

  1. 因此,您的正则表达式匹配“一”并提前到以下“二”(并将其存储在捕获组中)。

  2. 然后,因为第一个是可选的,它第二次匹配“两个”之前的空字符串并向前看下面的“两个”(并将其存储在捕获组中)

为什么你需要先行,当你捕获它的时候?

你应该描述你试图达到的目标。

试着回答你的问题:

要仅获得一个匹配项,请使第一组不是可选的:

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

或删除前瞻:

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

现在这意味着,如果有“一个两个”,它将作为您的第一个匹配项匹配。如果第一个缺少==>“两个”,那么它只会匹配第二组。

如果在开头添加一个锚点会怎样?

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

^匹配字符串的开头,因此当第一个单词可用时,它不应在第二个单词之前再次匹配。

于 2012-08-09T11:09:56.790 回答