2011-03-08 41 views
5

正則表達式裏面我有一個正則表達式:結腸癌的JavaScript

/^([a-zA-Z0-9_ -.''""]+)$/ 

它工作得很好,允許字母,數字和一些特殊字符,如-.'"

不,我希望它也允許冒號(:)。我嘗試了以下正則表達式,但它失敗 - 它開始允許許多其他特殊字符。

/^([a-zA-Z0-9_ :-.''""]+)$/ 

任何想法爲什麼?

回答

8

-在字符類中有特殊含義,就像在a-z中一樣。試試這個:

/^([a-zA-Z0-9_ :\-.'"]+)$/ 

-.(空間點)允許一些額外的字符,如#$多。如果這是故意的,請嘗試:

/^([a-zA-Z0-9_ -.'":]+)$/ 

另外,請注意,您不必多次包含任何字符,這是毫無意義的。 '"每次出現兩次,他們可以安全地刪除。

順便說一聲,冒號後出現character table,表示正則表達式無效。它不應該允許多餘的字符,你應該得到一個錯誤。在Firefox中,您會得到:invalid range in character class

+0

一個更可讀的替代方案可能是將'-'移到字符類的開始或結尾(這也會使其失去其特殊含義)。 – 2011-03-08 19:35:36

+0

@cebewee - 好的,那取決於。無論如何,我喜歡逃避它,以確保它的含義是明確的,並防止錯誤。另一個開發者可能會將'[a-z _-]'改爲'[a-z_-〜]',然後我們遇到問題。 – Kobi 2011-03-08 19:39:05

+0

+1,轉義總是比較安全。 – codaddict 2011-03-08 19:40:24

1

該表達式可能是錯誤的開始。你有/^([a-zA-Z0-9_ -.''""]+)$/你可能的意思是/^([a-zA-Z0-9_ \-.''""]+)$/(注意破折號前面的反斜槓)。 []中的-表示範圍,所以-.(空格虛線點)的意思是「從空間到點」,如果將冒號放在那裏,它只會改變該範圍。

因此增加結腸和逃避破折號(和刪除冗餘'"接近尾聲),你可能想:/^([a-zA-Z0-9_ \-.'":]+)$/

+0

謝謝。你是對的。 – Rajesh 2011-03-08 20:31:47

5

您可以使用:

/^([a-zA-Z0-9_ :.'"-]+)$/ 

我搬到-到字符類的末尾,以便字面處理而不是範圍運算符。您的原始正則表達式中也存在相同的問題,其中-正在作爲範圍運算符處理。

另外我從char類中刪除了多餘的'"

+0

謝謝。即使這個工作:) – Rajesh 2011-03-08 20:27:23