为什么这些正则表达式测试允许某些字符通过?

时间:2009-12-21 15:02:46

标签: c# regex

我正在检查带有以下正则表达式的字符串:

[a-zA-Z0-9]+
[A-Za-z]+

由于某种原因,字符:

.
-
_

允许通过,为什么会这样?

2 个答案:

答案 0 :(得分:18)

如果你想检查完整的字符串是否只包含你想要的anchor正则字符所需的字符,如下所示:

^[a-zA-Z0-9]+$

否则每个字符串都会传递,其中包含一个允许字符某处的字符串。锚点基本上告诉正则表达式引擎开始在字符串的开头查找这些字符,并停止查看字符串的结尾。

澄清一下:如果您只使用[a-zA-Z0-9]+作为正则表达式,则正则表达式引擎会正确拒绝字符串-__--,因为正则表达式与此不匹配。您定义的字符类中没有单个字符。

然而,使用字符串a-b它是不同的。正则表达式引擎将匹配此处的第一个a,因为它与您输入的表达式(至少一个给定字符)匹配,并且不关心-b。它完成了它的工作,并根据你的正则表达式成功地匹配了一个子字符串。

_-abcdef-类似 - 正则表达式将匹配子串abcdef就好了,因为你没有告诉它只匹配字符串的开头或结尾;并忽略其他角色。

因此,当使用^[a-zA-Z0-9]+$作为正则表达式时,您肯定会告诉正则表达式引擎您正在寻找一个或多个字母或数字,从字符串的开头直到字符串结尾。没有其他角色可以挤进或隐藏的空间,所以这将做你想要的。但是如果没有锚点,匹配可以在搜索字符串中任何地方。出于验证目的,您总是希望使用这些锚点。

答案 1 :(得分:0)

在正则表达式中,+告诉引擎匹配一个或多个字符。

因此,如果字符串包含1个或多个字母字符的序列,则此表达式[A-Za-z] +会通过。唯一不会传递的字符串是根本不包含字母字符的字符串。

^符号将字符类锚定到字符串的开头,$符号锚定到字符串的结尾。

所以^ [A-Za-z0-9] +表示'匹配以一个或多个字母数字字符序列开头的字符串'。但只要这些字符不在字符串的开头,就会允许包含非字母数字的字符串。

虽然^ [A-Za-z0-9] + $表示'匹配以一个或多个字母数字字符序列开头和结尾的字符串'。这是从字符串中完全排除非字母数字的唯一方法。