适用于token = "A%"
或token = "A B"
Regex.IsMatch(token, @"[a-zA-Z_](?:[a-zA-Z_]|\d)*");
返回true。为什么它不会像我认为的那样返回错误?
答案 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*$
相当但更短。