Javascript 正则表达式(负)后视在 Firefox 中不起作用

Posted

技术标签:

【中文标题】Javascript 正则表达式(负)后视在 Firefox 中不起作用【英文标题】:Javascript regex (negative) lookbehind not working in firefox 【发布时间】:2018-10-05 06:52:54 【问题描述】:

我需要修改以下 javascript 正则表达式,因为其中的 negative lookbehind 会在 firefox 中引发错误:

content = content.replace(/(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)/g, '„$1“');

有没有人有想法可以帮助我?

【问题讨论】:

您只需将= 移动到否定字符类/(?![^&lt;]&gt;)"([^"=]?)"(?!&gt;)/g 请在bugzilla.mozilla.org/show_bug.cgi?id=1225665bugzilla.mozilla.org/show_bug.cgi?id=1225665firefox 中为该问题投票 @bradlis7 你怎么投票? (我登录 bugzilla 已经有一段时间了,但我仍然没有看到投票按钮。我确实开始关注它 - 是不是同样的事情?)这似乎是少数没有 shim 的事情之一为。 @DarrenCook 登录后,在“详细信息面板”中显示“27 Votes [Vote]”。这是一个笨拙的用户界面,因为您必须转到投票页面,检查问题然后提交。 也许现在很快:bugzilla.mozilla.org/show_bug.cgi?id=1634135 【参考方案1】:

2 年后,Firefox 终于迎头赶上。 ES2018 RegExp 功能将包含在 FF78 中,将于 2020 年 6 月底发布:https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/78#JavaScript

【讨论】:

【参考方案2】:

2020 年 7 月 1 日更新

FireFox 78 版本开始,RegExp 最终支持后视、dotAll s 标志、Unicode 转义序列和命名捕获,请参阅 Release Notes:

SpiderMonkey 中的新 RegExp 引擎,增加了对 dotAll 标志、Unicode 转义序列、后向引用和命名捕获的支持。

非常感谢 FireFox 开发人员!!! ?????????????????


Lookbehinds 仅在支持 ECMA2018 标准的浏览器中可用,这意味着只有最新版本的 Chrome 才能处理它们。

要支持大多数浏览器,请将您的模式转换为仅使用前瞻。

(?&lt;!=) 否定后向查看确保当前位置左侧没有=[^"] 是与该字符匹配的原子(请注意,? 量词使其可选,但在 [^"] 之前的 " 不能是 = 并且没有必要限制该位置)。

所以,你可以使用

content = content.replace(/(?![^<]>)"([^"=]?)"(?!>)/g, '„$1"');
                                      ^^^^^

注意(?:[\"]) 等于"[^"=]? 匹配除 "= 之外的 1 或 0 次出现的字符。

请参阅regex demo。

【讨论】:

所以这两个正则表达式的工作方式相同,对吧?以前的正则表达式:(?![^&lt;]*&gt;)(?:[\"])([^"]*?)(?&lt;!=)(?:[\"])(?!&gt;) 新的正则表达式:(?![^&lt;]*&gt;)"([^"=]*?)"(?!&gt;) @Cla 如果不是我就不会发帖了。【参考方案3】:

与您的正则表达式 (?![^&lt;]*&gt;)"([^"]*?)(?&lt;!=)"(?!&gt;) 完全等价

没有后向断言是:

(?![^&lt;]*&gt;)"((?:[^"=]+|=(?!"))*)"(?!&gt;)

可读版本

 (?! [^<]* > )
 "
 (                             # (1 start)
      (?:
           [^"=]+ 
        |  
           = 
           (?! " )
      )*
 )                             # (1 end)
 "
 (?! > )

请注意,这与您选择的答案不同,它不是等效的。

【讨论】:

@EugeneBarsky - 感谢您的错字修复。【参考方案4】:

Lookbehind 断言是 ES2018 的一部分。 Firefox 尚不支持它们,这就是您收到错误消息的原因。

Chrome 从版本 62 开始支持它们,您可以在 Node.js >= 6.4 中使用和谐标志,或在 >= 9 中不使用任何标志。

您可以查看提案here & 浏览器支持here

【讨论】:

您知道解决此问题的方法吗?我正在尝试在没有后视的情况下重写正则表达式,但不知道如何。 发布您想要匹配的文本,以及预期的结果,我们将能够为您提供帮助。 Firefox 69 仍然不支持:caniuse.com/#feat=js-regexp-lookbehind 在 Firefox 77.0.1(64 位)中仍然不支持。耶进步!

以上是关于Javascript 正则表达式(负)后视在 Firefox 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Java 正则表达式的后视组在附近没有明显的最大长度

Java 正则表达式错误 - 使用组参考进行后视

复杂的 (PHP) 正则表达式,具有积极的后视能力

正则表达式替换文本,除非它前面有反斜杠而不使用后视

查找连续重复单词时的Python后视正则表达式“固定宽度模式”错误

Javascript如何判断一个变量是数字类型?