2009-12-21 47 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] + $表示'匹配以一個或多個字母數字字符序列開頭和結尾的字符串'。這是從字符串中完全排除非字母數字的唯一方法。

相關問題