2012-08-09 30 views
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. 所以,你的正则表达式“一”和前瞻匹配下面的“两化”(并存储也捕获组)。

  2. 然后,因为第一个是可选它匹配所述第二时间之前“两”和先行于以下“二”的空字符串(和存储,同样在捕获组)

为什么当你捕捉它时需要向前看?

你应该说明你试图达到的目标。

尝试回答你的问题:

为了得到只有一个匹配,使第一组不可选:

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

或删除先行:

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

现在这意味着,如果有“o两个“它匹配你的第一场比赛。它第一个缺少==>“两个”,那么它只会匹配第二个组。

如果一个锚添加到开始什么?

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

^字符串的开头匹配,所以它不应该在第二个字,当第一个可匹配前第二次。

+0

你应该提供更多的例子和你的期望。我不清楚你想达到什么目的。第二组是否也是可选的,或者它总是在那里,当有第一组时? – stema 2012-08-09 12:02:10

+0

感谢STEMA,但第一组是可选的我。“两”也是可能的 – user1587174 2012-08-09 12:02:31

+0

没有,第二组没有optional.i只想首次这一前瞻运行,并继续而不是回溯到“两节” – user1587174 2012-08-09 12:03:33