我试图理解为什么这返回假,以及我可以做些什么来使它成为真。

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

最佳答案

问题是您的前行要求bestlife在字符串中的相同位置。前瞻是零宽度的断言,并且不会提前RegExp索引。因此,您的/(?=best)(?=life)/i检查每个位置(如果您在代码中手动移动了lastIndex)是否在该位置后跟bestlife

采用

/^(?=.*best)(?=.*life)/i


此正则表达式将要求bestlife出现在字符串内的任何位置。



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


以免匹配bestieafterlife

最后但并非最不重要的一点是:如果您的字符串可以包含换行符,请用.*替换[\s\S]*,因为JS正则表达式中的点不能与换行符匹配。

关于javascript - JS RegExp()用于查找事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35340248/

10-09 20:39