我正在试图理解为什么这会返回错误,以及我能做些什么才能成功。
var str = "The best things in life are free";
var patt = new RegExp(/(?=best)(?=life)/i);
var res = patt.test(str); // = false. But expect true because both 'best' and 'life' are in the string
答案 0 :(得分:1)
问题在于,您的前瞻要求best
和life
位于字符串中的相同位置。前瞻是零宽度断言,不推进RegExp索引。因此,如果您的位置跟随/(?=best)(?=life)/i
和 {{1},则您lastIndex
检查每个位置(如果您在代码中手动移动best
) }。
使用
life
此正则表达式需要/^(?=.*best)(?=.*life)/i
和best
出现在字符串中的任何位置。
life

为什么var str = "The best things in life are free";
var patt = /^(?=.*best)(?=.*life)/i;
var res = patt.test(str);
document.body.innerHTML = res;
但不是/^(?=.*best)(?=.*life)/i
?
未锚定时,会在每个位置执行前瞻。当我们在开头设置/(?=.*best)(?=.*life)/i
时,两个前瞻一个接一个地执行(如果前一个成功)。只执行一次性能会更好。但是,在这种情况下,没有区别,因为正则表达式中没有^
修饰符。
为什么不/g
?
你可以,它需要一个轮换,如果你有很多这样的选择,它将更难维护。
为什么不使用/best.*life|life.*best/
?
因为下一个可能的增强功能将两个单词匹配为整个单词:
.indexOf
以免与/^(?=.*\bbest\b)(?=.*\blife\b)/i
或bestie
匹配。
最后,但并非最不重要的注意:如果您的字符串可以包含换行符,请将afterlife
替换为.*
,因为JS正则表达式中的点不能匹配换行符。