2009-12-21 69 views
0

我检查与下面的正则表达式的字符串:为什么这些正则表达式测试会让某些字符通过?

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

出于某种原因,字符:

. 
- 
_ 

被允许通过,这是为什么?

+2

你是如何检查你的字符串?你能发布整个验证码吗? – moonshadow 2009-12-21 15:04:35

+0

你用[^ a-zA-Z0-9]回复它,并拒绝那些与之匹配的:) – Don 2009-12-21 16:00:39

回答

18

如果要检查整个字符串只包含你需要anchor您正则表达式像如下想要的字符:

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

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

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

但是,与字符串a-b它是不同的。正则表达式引擎将与此处的第一个a匹配,因为它与您输入的表达式(至少一个给定字符)匹配,并且不会在乎-b。它已经完成了自己的工作,并根据您的正则表达式成功匹配了一个子字符串。

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

所以当使用^[a-zA-Z0-9]+$作为你的正则表达式时,你明确地告诉正则表达式引擎你正在寻找一个或多个字母或数字,从字符串的最开始直到字符串的结尾。没有其他角色挤入或隐藏的空间,所以这将做你明显想要的东西。但是没有锚点,匹配可以是任意位置在您的搜索字符串中。出于验证目的,您总是希望使用这些锚点。

+0

但为什么是句号/短划线/下划线允许? – mrblah 2009-12-21 15:23:07

+1

@mrblah:因为'[a-zA-Z0-9] +'只与该块中的一个或多个字符匹配。所以,如果你不固定它,只要有这些角色中的一个,它就会通过正则表达式。 – Powerlord 2009-12-21 15:34:30

+0

到mrblah:阅读你的表达式为:找到一个或多个从a到z,从A到Z以及从0到9的符号。所以如果有其他符号 - 不关心。 ^表示您的符号应该从头开始,$ - 最后,并且当您将这两个符号都设置为约翰内斯时 - 从开始到结束,预计不会有其他符号。 – 2009-12-21 15:38:26

0

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

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

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

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

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

相关问题