我收到了以下正则表达式电话 -
MatchCollection matches = Regex.Matches(text,@"( And )|( Or )|( Not )"
我遇到了像这样的字符串的问题 - “而不是”
只有“And”会匹配,但“Or”和“Not”不会,只是因为它们不是第一个单词。
据我所知,原因是第一场比赛是“And”包括尾随空格,因此正则表达式不会将其识别为下一场比赛的潜在空白区域,并忽略它,只是因为它是第一场比赛的一部分。
所以,如果例如这是我的字符串 - “And Or Not” - 每个单词都会匹配。
有没有办法以某种方式指示正则表达式在匹配之间共享匹配的空格?
谢谢!
答案 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
而不是空格)