2015-09-25 92 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

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