2013-07-02 89 views
2

我想驗證一個值檢查以下格式之一:..A , B.. , A..B正則表達式,提取物組

,並檢索值:(null, A) , (B, null) , (A, B)

這是我的代碼:

var regexRange = new RegExp("^([a-zA-Z0-9]+)\.\.([a-zA-Z0-9]*)$|^[a-zA-Z0-9]*\.\.([a-zA-Z0-9]+)$"); 

function getRangeValues(value) { 
    var from = null; 
    var to = null; 
    var matches = regexRange.exec(value); 
    if (matches !== null) { 
     if (matches[3] !== undefined) { 
      to = matches[3]; 
     } 
     else if(matches[1]!==undefined && matches[1]!=='') { 
      from = matches[1]; 
      if (matches[2] !== undefined && matches[2] !== '') { 
       to = matches[2]; 
      } 
     } 
    }  
    var range = { From: from, To: to }; 
    return range; 
} 

Value: 1233 => From=12, To=null 

我不明白爲什麼我得到這個不正確的行爲,對於其他用例似乎工作。

+0

_「我不明白爲什麼我得到這個不正確的行爲」 _ - 哪個不正確的行爲?你在說什麼「1233」的輸入? – nnnnnn

+0

是的,這就是我正在談論的 – gigi

+0

使用反斜槓似乎確實有用。請給它一個答案。 – gigi

回答

1

我認爲問題是,你沒有逃脫反斜槓字符串文字,你從創建的正則表達式英寸字符串文字裏面你需要\\.\\.如果你想要得到的正則表達式有\.\.

var regexRange = new RegExp("^([a-zA-Z0-9]+)\\.\\.([a-zA-Z0-9]*)$|^[a-zA-Z0-9]*\\.\\.([a-zA-Z0-9]+)$"); 

字符串中的單反斜線,如果他們後面沒有需要轉義字符被忽略,所以你正在創建一個正則表達式其中包含與任何兩個字符匹配的..。使用更方便的文字正則表達式:

var regexRange = /^([a-zA-Z0-9]+)\.\.([a-zA-Z0-9]*)$|^[a-zA-Z0-9]*\.\.([a-zA-Z0-9]+)$/; 

(當然也有可能是其他問題,但我認爲一個跳出)

+0

非常好的觀察。謝謝。 – gigi

1

你能做到這樣instead.You可以拆分輸入,然後驗證它

var output=value.split(".."); 
var from=output[0]; 
var to=output[1]; 
if(from.length>=1 || to.length>=1) 
{ 
if(from.search(/[^a-zA-Z0-9]/)==-1 && to.search(/[^a-zA-Z0-9]/)==-1)//valid 
else //invalid 
} 
else//invalid 
+0

雖然這不會驗證字符串格式。 –

+0

@TimPietzcker oops..edited回答..感謝 – Anirudha

+1

「爲什麼使用正則表達式」,的確如此:) –

0

我覺得你這樣事情就簡單很多:

^([a-zA-Z0-9]+)?\.\.([a-zA-Z0-9]+)?$ 

會匹配所有三種情況下你提出並捕獲正確組中的所有內容(如果存在)。但是,它也會匹配你可能不想要的..。所以,我們可以添加一個positive lookahead assertion,以確保至少一個alnum字符的情況下:

^(?=.*[a-zA-Z0-9])([a-zA-Z0-9]+)?\.\.([a-zA-Z0-9]+)?$ 

然後,你可以做

var myregexp = /^(?=.*[a-zA-Z0-9])([a-zA-Z0-9]+)?\.\.([a-zA-Z0-9]+)?$/; 
var match = myregexp.exec(subject); 
if (match != null) { 
    var from = match[1] 
    var to = match[2] 
} 
+0

感謝您的努力,但似乎並不奏效。我得到未定義,未定義的A,A ..,A..B – gigi

+0

@吉吉:你在我的代碼中使用了文字正則表達式的構造函數嗎,還是你把正則表達式粘貼到你的字符串中了? NNNNNN)? –

0

我相信你的正則表達式可以簡化。考慮以下代碼:

str='..A , B.. , A..B'; 
re = /(\w*)\.\.(\w*)/g; 
var arr = []; 
var match; 
while (match = re.exec(str)) 
    arr.push([ match[1]=="" ? null:match[1], match[2]=="" ? null:match[2] ]); 
console.log(arr); 
// OUTPUT: [[null, "A"], ["B", null], ["A", "B"]]