我目前的代码是:
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
返回两场比赛。
如何编写正则表达式以仅返回一个匹配项?
答案 0 :(得分:2)
这是因为你让你的第一组可选,顺便说一句。你可以删除第一组的一组括号。
因此,你的正则表达式匹配“一”并向前看到以下“两个”(并且也存储在捕获组中)。
然后,因为第一个是可选的,它匹配第二次在“两个”之前的空字符串和前瞻到下面的“两个”(并且也存储在捕获组中)
< / LI> 醇>为什么当你捕获它时需要前瞻?
你应该描述你想要达到的目标。
尝试回答您的问题:
要只获得一场比赛,使第一组不可选:
const string reg = "(?<first>one )(?=(?<second>two))";
或删除前瞻:
const string reg = "(?<first>one )?(?<second>two)";
现在这意味着,如果有“一个两个”它匹配作为你的第一个匹配。它首先缺少==&gt; “两个”,那么它只会匹配第二组。
如果您在开始时添加锚点怎么办?
const string reg = "^(?<first>one )?(?=(?<second>two))";
^
匹配字符串的开头,因此它不应该在第二个字之前第二次匹配,当第一个字可用时。