2013-07-19 77 views
0

我需要驗證一個字符串,該字符串可以包含任意數量的字符,逗號和2個字符。我有一些問題。下面是我有:正則表達式問題 - 字符限制和空白忽略

var str="ab,cdf"; 
var patt1=new RegExp("[A-z]{2,}[,][A-z]{2}"); 
if(patt1.test(str)) { 
    alert("true"); 
} 
else { 
    alert("false"); 
} 

我希望它可以返回false,因爲我對角色的{2}限制逗號後,這串具有三個字符。但是,當我運行fiddle時,它會返回true。我對RegExp的理解(當然是有限的)表明{2,}至少是2,而{2}恰好是2,所以我不確定爲什麼在逗號後面的三個字符仍然返回true。

我還需要能夠忽略逗號和其餘兩個字符之間可能的空格。 (換句話說,如果它們在逗號之前有2個字符,而在它之後有兩個字符,那麼我希望它返回true - 兩個之後它不包括用戶可能已輸入的任何空格。)

所以所有這些應該返回true:

var str = "ab, cd"; 
var str = "abc, cd"; 
var str = "ab,cd"; 
var str = "abc,dc"; 

我已經試過逗號這樣以後添加\S指標:

var patt1=new RegExp("[A-z]{2,}[,]\S[A-z]{2}"); 

但隨後的字符串返回false所有的時間,甚至當我有它設置爲ab, cd,這應該返回true。

我錯過了什麼?

+0

[你擺弄的代碼(http://jsfiddle.net/EmmyS/z2fTr /)實際上與[您的問題的代碼](http://stackoverflow.com/q/17751150/578288)不同。它表示「{2,}」而不是「{2}」。但這不是問題;當我解決這個問題時,你的小提琴仍然會提示'真實'。 –

+0

你的'\ S'問題(除了它應該是'\ s'的事實)是字符串轉義。你在''''引號內加載你的正則表達式,而不是'''文字的語法,所以你需要在你引用內的任何'\'字符轉義爲\\'。 –

+0

嘗試http://regexpal.com/這是很好的實驗。 – Jacob

回答

2

{2,}至少爲2,和{2}恰好是兩個,所以我米不知道爲什麼三個字符後逗號仍然返回true。

這是正確的。你忘記的是anchor你的表達式以字符串開始和結束 - 否則當發生在字符串的某處時返回true。

不包括任何空白:我已經試過了逗號

這是完全相反的後面添加\ S指示器。\s匹配空白字符,\S匹配所有非空白字符。此外,您可能需要一些空白的optional repetition,而不是需要確切的一個。

[A-z] 

注意,這個字符範圍還包括Za,即[]^_`之間的字符。您可能會想要[A-Za-z],或使用[a-z]並使您的正則表達式不區分大小寫。

結合起來,這是你的正則表達式應該是什麼樣子(使用而不是regular expression literalRegExp構造函數用於字符串):

var patt1 = /^[a-z]{2,},\s*[a-z]{2}$/i; 
+0

謝謝!這工作。我很少需要正則表達式,所以我沒有花太多時間來處理它,而小變幻莫測可以帶來很大的改變。 – EmmyS

1

你缺少^$。還有的範圍應該是[a-zA-Z][A-z]

你的正則表達式應該是

^[a-zA-Z]{2,}[,]\s*[A-Za-z]{2}$ 

^會從一開始就匹配字符串...

$會匹配字符串直到結束。

沒有$^它會在任何地方匹配字符串之間

\s*將匹配0到很多空間..

+0

對於任何字母字符,[A-z]都返回true,而不管大小寫。 (或者似乎在我的測試中) – EmmyS

+1

@EmmyS它也會匹配'[',\,']','^','_' ..請參閱ascii表 – Anirudha