如何使正则表达式不再重复前瞻

时间:2012-08-09 10:54:16

标签: c# regex

我目前的代码是:

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

返回两场比赛。

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

1 个答案:

答案 0 :(得分:2)

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

  1. 因此,你的正则表达式匹配“一”并向前看到以下“两个”(并且也存储在捕获组中)。

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

    < / LI>

    为什么当你捕获它时需要前瞻?

    你应该描述你想要达到的目标。

    尝试回答您的问题:

    要只获得一场比赛,使第一组不可选:

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

    或删除前瞻:

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

    现在这意味着,如果有“一个两个”它匹配作为你的第一个匹配。它首先缺少==&gt; “两个”,那么它只会匹配第二组。

    如果您在开始时添加锚点怎么办?

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

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