C#Regex.Matches - 以前匹配的字符在下次匹配时无法匹配

时间:2011-10-26 09:26:37

标签: c# regex

我收到了以下正则表达式电话 -

MatchCollection matches = Regex.Matches(text,@"( And )|( Or )|( Not )"

我遇到了像这样的字符串的问题 - “而不是”

只有“And”会匹配,但“Or”和“Not”不会,只是因为它们不是第一个单词。

据我所知,原因是第一场比赛是“And”包括尾随空格,因此正则表达式不会将其识别为下一场比赛的潜在空白区域,并忽略它,只是因为它是第一场比赛的一部分。

所以,如果例如这是我的字符串 - “And Or Not” - 每个单词都会匹配。

有没有办法以某种方式指示正则表达式在匹配之间共享匹配的空格?

谢谢!

3 个答案:

答案 0 :(得分:4)

您应该寻找单词边界,而不是明确地查找空格。

只需要去look it up,但显然,\b就是你想要的,例如:

@"(\bAnd\b)|(\bOr\b)|(\bNot\b)"

(或者,正如@stema指出的那样):

@"\b(And|Or|Not)\b"

答案 1 :(得分:2)

问题是,如果你匹配一个空格,正则表达式在最后一次匹配后继续,那么这个空间就是说“已经消失”了,因为它已经匹配了。

你可以做的就是使用这样的前瞻:

MatchCollection matches = Regex.Matches(s, @" (?:And|Or|Not)(?= )");

前瞻与空间不匹配,如果后面有空格,它只是向前看。如果没有空格,表达式将不匹配 但是你的MatchCollection中的结果最终不会有这个空间!

答案 2 :(得分:1)

我会稍微简化一下表达式并使用look-ahead assertion(匹配一些东西,但不要让它成为捕获的一部分):

string text = " And Or Not ";
foreach (Match m in Regex.Matches(text, @"\s(And|Or|Not)(?=\s)")) {
    Console.WriteLine(m.Value);
}

(注意:我使用的是\s而不是空格)