regex.test()只能每隔一段时间运行一次

时间:2010-10-08 14:39:47

标签: javascript regex firefox google-chrome safari

正则表达式test()让我在Firefox和Chrome中遇到问题,但它在Opera和Safari中运行完美。

麻烦的代码:

var pattern = /(\s+(?!\$\w+)|(^(?!\$\w+)))/g;
if(pattern.test(String(id).replace(/\s+OR|AND\s+/g, ''))) {
 searchError("You suck.");
 return 1;
}

当你进入白色空间时,它每次都会阻挡它。当您传递'$a b'之类的内容时,它会在Firefox / Chrome中每隔一段时间运行一次。 WEIRD。

2 个答案:

答案 0 :(得分:65)

这是RegEx引擎中的一个错误,a similar question with the same issue came up here

从我对该问题的回答:这是在ECMAScript 3 there's a great post on the details here中实现正则表达式的方式的错误。

基础知识为/regex/g修饰符未正确重置,因此如果每个人<{1}},.test()true之间会有多个false次来电。 em>应该为true,其他所有调用都会成功重置它。

答案 1 :(得分:0)

这似乎仍然是 2021 年 8 月的一个问题......我只是想分享一些我在偶然发现这个问题和答案之前学到的东西。我被这个问题弄糊涂了,没有任何有意义的前进方向 - 直到现在。

  1. 使用 exec()test()match() 都没有关系。正则表达式仍然无法在所有其他情况下正常工作。

  2. 设置正则表达式没关系

let reg = new RegExp(/<table(\s*[^>]*)>/g);

或使用 const。无论是全局设置还是本地设置都没关系...

绕过此问题的作用是将正则表达式语句括在循环中的括号中,如下所示:

Object.keys(table).forEach(key => {
    if((new RegExp(/<table(\s*[^>]*)>/g)).test(___your test string___)){
        //Do what you need to do
    }
});

去掉正则表达式周围的括号,然后观察其他一个都失败......

非常感谢@Nick Craver 的回答和@prototype 的评论!

This exact Regex 给我带来了麻烦。它对一个对象有效,而对后续对象失败,这毫无意义。我只是想说这在 2021 年仍然非常相关