2015-09-25 91 views
-1

我試圖把一堆正則表達式更安全,我的意思是更安全,我想要更多的準確性。使正則表達式更安全

所以,我很新的RegExp,我想知道如果我這樣做是正確的(不是正則表達式,但變成更安全)。

所以,我現在就開始了,這是我想要改變的第一個RegExp,我想推01/2011。

過去的正則表達式:

var text = 'INSCRIÇÃO: 60.537.263/0001-66 COMP: 01/2011 COD REC: 150'; 
var reg  = /COMP.*?(\d\S*)/; 
var match = reg.exec(text); 
console.log(match[1]); 

新的RegExp:

var text = 'INSCRIÇÃO: 60.537.263/0001-66 COMP: 01/2011 COD REC: 150'; 
var reg  = /COMP:\s([0-9]{0,2}\/[0-9]{0,4})/; 
var match = reg.exec(text); 
console.log(match[1]); 

這是爲什麼?這個文本只是一個巨大文本的一部分,所以我需要準確性。

其他問題是關於轉正規表達式可選,所以如果不匹配任何東西,返回undefined。

謝謝。

+2

這裏的主要問題是什麼? – anubhava

+0

關於安全性,我想知道第二個RegExp是否安全。 – user98293989823

+1

請定義「RegExp安全性」。你想要處理什麼字符串?至少有什麼樣的模式?看看,如果你總是需要在'COMP:'+空格之後直接匹配用'/'分隔的數字,我們可以推測很多事情(用'*'使空白可選,避免與'{1, 4}'等)我懷疑這個問題可以回答沒有定義**具體的**要求。 –

回答

1

根據您的反饋:

我想特別是與兩個數字,一個/和四位數字

推值

您可以使用

/\bCOMP:\s*(\d{2}\/\d{4})(?!\d)/g 

\b是字邊界,因此5COMP將不匹配。

\s*將匹配0個或更多空格(如果必須有空格,則使用+量詞替代)。

\d{2}將恰好匹配2位數字。

由於前瞻(?!\d)\d{4}將匹配4位數字。這種預測只是確保在前4位數字之後沒有數字。您也可以在這裏使用\b以確保匹配單詞邊界。

arr = []; 
 
var re = /\bCOMP:\s*(\d{2}\/\d{4})(?!\d)/g; 
 
var str = 'COMP:10/9995, COMP: 21/1234, COMP: 21/123434, REGCOMP: 21/1234'; 
 
var m; 
 
    
 
while ((m = re.exec(str)) !== null) { 
 
    arr.push(m[1]); 
 
} 
 
console.log(arr);

+1

Perect!謝謝@stribizhev! – user98293989823

+0

如果我不要求太多,是否有可能使正則表達式可選,如..我想,如果沒有找到,返回undefined或類似的東西..所以我可以把||正則表達式之後的'NOTHING'。 – user98293989823

+0

我用代碼片段更新了答案。它是否按預期工作? –