我试图理解为什么这返回假,以及我可以做些什么来使它成为真。
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
最佳答案
问题是您的前行要求best
和life
在字符串中的相同位置。前瞻是零宽度的断言,并且不会提前RegExp索引。因此,您的/(?=best)(?=life)/i
检查每个位置(如果您在代码中手动移动了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
。最后但并非最不重要的一点是:如果您的字符串可以包含换行符,请用
.*
替换[\s\S]*
,因为JS正则表达式中的点不能与换行符匹配。关于javascript - JS RegExp()用于查找事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35340248/