正则表达式.IsMatch返回true,但http://www.regexr.com/返回false

本文关键字:返回 www regexr com false http IsMatch true 正则表达式 | 更新日期: 2023-09-27 18:17:45

我试图检查下一个字符串是否与此模式匹配:

string str = "CRSSA.T,";
var pattern = @"(('w+'.{1}'w+)+(,'w+'.{1}'w+)*)";
Console.WriteLine(Regex.IsMatch(str, pattern));

site: http://www.regexr.com/表示不匹配(除了最后一个逗号之外,所有内容都匹配),但该代码打印为True。这可能吗?

谢谢吧!:)

正则表达式.IsMatch返回true,但http://www.regexr.com/返回false

首先,不同的正则表达式引擎不一致是可能发生的,要么是因为功能不同,要么是因为解释不同,例如Java的String.matches方法明确要求整个字符串匹配,而不仅仅是子字符串。

在您的例子中,虽然,regexr和。net都说它匹配,因为子字符串CRSSA.T将匹配。您的第三组,包含逗号,有一个*量词,即它可以匹配零次或多次。在这种情况下,它匹配了0次,但没关系。还是匹配的

如果你想匹配整个字符串,而不是任何子字符串,那么你需要在你的正则表达式中添加锚:

^(('w+'.{1}'w+)+(,'w+'.{1}'w+)*)$

此外,{1}是一个无用的量词,您可以忽略它。另外,如果你在整个正则表达式周围有一个捕获组,你也可以把它去掉,因为它已经在自动捕获组0中了。简单一点,你可以使用:

^('w+'.'w+)+(,'w+'.'w+)*$

也要小心'w'b。这两个特性(根据'w'W的定义)紧密相连,并不总是直观的。例如,它们包括下划线,并且,取决于正则引擎,不仅仅是[A-Za-z_],例如,在。net中,'w还匹配ä, µ, Ð, ªº。出于这些原因,我倾向于在编写更健壮的正则表达式时相当明确(即那些不仅仅用于快速一次性使用的正则表达式),并使用[A-Za-z], 'p{L}, (?='P{L}|$)等而不是'w, 'W'b