RegEx 在检查电子邮件 ID 时花费太多
RegExp taking too much in checking emailid
我正在使用以下代码检查一个值,无论它是否为 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("kuldeep.sharma@daffodilsw.com-daffodilsw");
console.log("value>>>>"+a+">>>time>>>>"+(new Date()-sTime));
大约需要 55 秒。给出上面输入的结果,如果我把它改成
var a = getEmailId("rajit.garg@daffodilsw.com-daffodilsw");
给出结果大约需要 3.5 秒。
我无法理解这种行为。
谁能帮我理解这种行为,有什么方法可以立即得到结果。
当您传递 kuldeep.sharma@daffodilsw.com-daffodilsw
字符串时,正则表达式引擎会遇到 catastrophic backtracking (see here).
原因是可选的 [\.-]?
实际上使引擎匹配 \w+(\w+)*
。解决方案是删除此 ?
:
^\w+(?:[.-]\w+)*@\w+(?:[.-]\w+)*(?:\.\w{2,3})+$
见demo
^\w+[.\w-]*\w+@\w+[.\w-]*\w+(\.\w{2,3})+$
不用遇到catastrophic backtracking
.
就可以直接用这个
我正在使用以下代码检查一个值,无论它是否为 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("kuldeep.sharma@daffodilsw.com-daffodilsw");
console.log("value>>>>"+a+">>>time>>>>"+(new Date()-sTime));
大约需要 55 秒。给出上面输入的结果,如果我把它改成
var a = getEmailId("rajit.garg@daffodilsw.com-daffodilsw");
给出结果大约需要 3.5 秒。
我无法理解这种行为。
谁能帮我理解这种行为,有什么方法可以立即得到结果。
当您传递 kuldeep.sharma@daffodilsw.com-daffodilsw
字符串时,正则表达式引擎会遇到 catastrophic backtracking (see here).
原因是可选的 [\.-]?
实际上使引擎匹配 \w+(\w+)*
。解决方案是删除此 ?
:
^\w+(?:[.-]\w+)*@\w+(?:[.-]\w+)*(?:\.\w{2,3})+$
见demo
^\w+[.\w-]*\w+@\w+[.\w-]*\w+(\.\w{2,3})+$
不用遇到catastrophic backtracking
.