Regex.IsMatch给出了真实,但http://www.regexr.com/给出了假

时间:2015-10-14 14:49:15

标签: c#

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

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

网站:http://www.regexr.com/表示它不匹配(一切都匹配,除了最后一个逗号),但该代码打印为True。有可能吗?

向前谢谢! :)

1 个答案:

答案 0 :(得分:1)

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

在你的情况下,regexr和.NET都说它匹配,因为子串CRSSA.T将匹配。包含逗号的第三个组具有*量词,即它可以匹配零次或多次。在这种情况下,它匹配零次,但没关系。它还是一场比赛。

如果你想要整个字符串匹配,并且没有任何子字符串,那么你需要为你的正则表达式添加锚点:

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

此外,{1}是一个无用的量词,你可以把它留下来。此外,如果你有一个围绕整个正则表达式的捕获组,你也可以将其保留,因为它已经自动捕获组0。所以你可以使用一点简化:

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

另请注意\w\b。这两个特征是紧密相连的(根据\w\W的定义,并不总是直观的。例如,它们包括下划线,并且,取决于正则表达式引擎,不仅仅是{{1}例如,在.NET [A-Za-z_]中也匹配\wäµÐª等内容。出于这些原因,我在编写更强大的正则表达式(即那些不仅用于快速一次性使用的正则表达式)并使用诸如º[A-Za-z]\p{L}等内容时,往往会非常明确。代替(?=\P{L}|$)\w\W