【问题标题】:regex.test() only works every other timeregex.test() 每隔一段时间才有效
【发布时间】:2011-04-22 22:36:17
【问题描述】:

Regex 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 中每隔一段时间运行一次。很奇怪。

【问题讨论】:

  • 用静态的东西替换id,看看是否可行。
  • omg :-) 似乎是一个有趣的错误...

标签: javascript regex firefox google-chrome safari


【解决方案1】:

这似乎仍然是 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 年仍然非常相关

【讨论】:

  • 看@halfer 我很欣赏编辑,但我不欣赏删除“感谢上帝”。说真的,我好几天都找不到答案,最后发现这个答案已经发布了。如果这样的事情有时不是上帝的礼物,那么我不知道是什么......我宁愿删除这个“答案”(这实际上只是说明了正则表达式问题向其他领域的传播)如果你想把上帝从其中剥离出来。
  • 我理解你的观点,并表示同情。多年来,我们这里有一些人想要在他们的帖子中添加有神论、宗教、迷信和其他此类材料,而社区的观点是,这并不代表我们所追求的技术、中立观点。我们有一个canonical discussion here
  • Stack Overflow 的特点是我们正在为许多未来的读者创建文档,这对新成员来说可能是一个惊喜。我承认这需要一点时间来适应,因为几十年来“论坛模式”鼓励贡献者将帖子视为自己的材料(他们可以完全控制)。在这里,我们可能更像是一个可相互编辑的 wiki。
【解决方案2】:

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

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

基本情况是带有g 修饰符的/regex/ 无法正确重置,因此如果每个人都应该为@987654328,则多个.test() 调用在truefalse 之间交替@,其他所有调用都会成功重置它。

【讨论】:

  • @Jackson,如果这回答了您的问题(应该),然后单击左侧的小复选标记 -- 将其标记为已接受的答案。
  • 如果您使用这样的语句检查某些内容,这绝对很糟糕,在两个项目字段if (regex.test( item.name) || regex.test( item.description )) 中的任何一个中寻找匹配项,其中一半表达式匹配一半时间,具体取决于搜索词顺序,导致极不合逻辑的搜索结果。震惊了这个仍然没有修复(2014 年 5 月)。
  • 这到底是怎么回事...我快疯了,为什么我的console.log 会返回true 而我的if 条件紧随其后是false
  • 我只是想说这个问题在 10 年后 Chrome 81 中仍然存在
  • 对我来说包装正则表达式,例如pattern 到 ` (new RegExp(pattern))` 似乎有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2011-01-25
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多