用于查找事件的JS RegExp()

时间:2016-02-11 13:09:47

标签: javascript regex

我正在试图理解为什么这会返回错误,以及我能做些什么才能成功。

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

1 个答案:

答案 0 :(得分:1)

问题在于,您的前瞻要求bestlife位于字符串中的相同位置。前瞻是零宽度断言,不推进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正则表达式中的点不能匹配换行符。