2011-03-21 97 views
3

新手正则表达式的问题/ C#:(*)(。*)简单的正则表达式的问题/多重匹配

考虑;以及如何将匹配 “A = B = C”

我exepected拿到两因为有两种方法可以组合和匹配:

(A = B) = (C) 

    or 

(A) = (B = C) 

但是我只找回一个匹配对象(第一种情况)。所以我想我不明白为什么比赛集合是一个集合 - 因为我似乎无法获得多个项目。有人可以解释吗?


仅供参考 - 对于上面的测试我只是用IMMED窗口:

?Regex.Matches("A = B = C", "(.*)=(.*)").Count 
1 

?Regex.Matches("A = B = C", "(.*)=(.*)")[0].Groups[1].Captures[0] 
Value: "A = B" 

?Regex.Matches("A = B = C", "(.*)=(.*)")[0].Groups[1].Captures[1] 
Value: "C" 
+0

实际上,该正则表达式不会与(C)部分相匹配。一旦引擎匹配第一部分,剩下的部分就是......'= C',但是你的正则表达式是要求一个字母,然后等于另一个字母。我想不出一个正则表达式可以做你正在寻找的东西,但是你的正则表达式绝对不适合你正在寻找的东西。 – DavidAndroidDev 2011-03-21 16:25:01

回答

3

Matches返回的集合包含连续的匹配项,而不是字符串的同一部分的替代匹配项。因此,如果您传入字符串“A = B \ nC = D”,则会返回两个匹配项:一个用于“A = B”,一个用于“C = D”(因为.与换行符不匹配) ,

0

它不工作的方式....

如果你输入的文字是:

"A = B = C\r\nW = X = Z" 

和你的表情是

"([^=]?) = ([^=]?) = ([^=]?)" 

那么你会得到多个结果。请阅读文档! :-D

+0

有了这种类型的答案,链接将是有益的... – 2011-03-21 16:21:32

+0

看看这个:http://www.radsoftware.com.au/regexdesigner/它是一个很好的工具来设计和编辑正则表达式在C#中,并内置帮助。 – 2011-03-21 16:34:14

2

.*通常是贪婪的。这意味着它尽可能匹配尽可能多的字符,同时满足表达式。因此,第一个.*与“A = B”匹配,第二个为“C”。.*

您可以使用?表达后。 .*?将匹配尽可能少的字符,同时满足表达式。

2

正则表达式以这样的方式工作,即当找到匹配项时,已经匹配的输入部分已被忽略。因此,当A = B已匹配时,该部分输入将不会受到任何更多匹配。

0

*量词是贪婪的。这使得第一表达.*比赛多字符越好,这样,表达式将始终与(A = B) = (C).

使用不贪心量词*?将匹配(A) = (B = C)

请尝试使用它!