我试图在此代码中检查下一个字符串是否与此模式匹配:
string str = "CRSSA.T,";
var pattern = @"((\w+\.{1}\w+)+(,\w+\.{1}\w+)*)";
Console.WriteLine(Regex.IsMatch(str, pattern));
网站:http://www.regexr.com/表示它不匹配(一切都匹配,除了最后一个逗号),但该代码打印为True。有可能吗?
向前谢谢! :)
答案 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
。