2015-05-25 79 views
0

我正在检查一个值,不管它是emailid还是不使用下面的代码。RegExp在检查emailid时花费太多

function getEmailId(inputTxt){ 
    var email = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; 
    return new RegExp(email).test(inputTxt); 
} 


var sTime = new Date(); 
var a = getEmailId("[email protected]"); 

console.log("value>>>>"+a+">>>time>>>>"+(new Date()-sTime)); 

大约需要55秒。给出上面的输入结果,如果我将其更改为

var a = getEmailId("[email protected]"); 

需要将近3.5秒才能得出结果。

我无法理解此行为。

任何人都可以帮助我理解这种行为,并有任何方式可以立即得到结果。

+0

你为什么这样做的东西'新RegExp'这已经是一个正则表达式? –

+1

@Hacketo必须具体环境,Safari没有问题。 –

+0

铬没有问题 –

回答

1
^\w+[.\w-]*\[email protected]\w+[.\w-]*\w+(\.\w{2,3})+$ 

你可以简单地使用,而不会遇到catastrophic backtracking

See demo.

+0

嗨vks,谢谢,这也是工作,但现在我有点困惑哪一个更好用,这一个或stribizhev建议^ \ w +(?:[.-] \ w +)* @ \ w +(?:[ .-] \ w +)*(?:\。\ w {2,3})+ $ –

+0

@RajitGarg另一个不接受电子邮件ID,例如'abc.asd.-asd @ gami.com' – vks

+0

是的,您是绝对正确,但有没有任何情况下,这可能会失败。谢谢 –

2

当您通过[email protected]字符串时,正则表达式引擎会运行到catastrophic backtrackingsee here)。

原因是可选的[\.-]?,实际上使发动机匹配\w+(\w+)*。解决的办法是删除此?

^\w+(?:[.-]\w+)*@\w+(?:[.-]\w+)*(?:\.\w{2,3})+$ 

demo

+0

非常感谢stribizhev,这是工作,我已经检查了大多数情况下.. –

+0

我喜欢“灾难性的回溯”一词。 –

+0

只是FYI:有关“灾难性回溯”的更多详细信息,请参阅[此链接](http://www.regular-expressions.info/catastrophic.html)。 –