当我没想到它时,正则表达式匹配%并忽略空格

时间:2015-09-23 17:20:54

标签: c# regex

适用于token = "A%"token = "A B"

Regex.IsMatch(token, @"[a-zA-Z_](?:[a-zA-Z_]|\d)*");

返回true。为什么它不会像我认为的那样返回错误?

2 个答案:

答案 0 :(得分:1)

如果我们将正则表达式分为两部分,我们会得到[a-zA-Z_],然后是(?:[a-zA-Z_]|\d)*。现在,第一部分只匹配一个字符,在两个示例中都是A。第二部分之后是*,这意味着重复零次或多次

在这两种情况下,这个正则表达式将匹配第一部分A,然后第二部分重复次,即没有。

答案 1 :(得分:0)

原因是你的表达式与两者中的第一个A匹配:

您要求强制[a-zA-Z_]后跟可选部分(...)*。强制部分与A匹配,而跳过可选部分。

如果我理解您的意图正确,那么您希望正则表达式确保令牌中没有其他内容。您可以通过在表达式中添加^和$来实现:

^[a-zA-Z_](?:[a-zA-Z_]|\d)*$

甚至:

^[a-zA-Z_]\w*$

相当但更短。