Javascript 正则表达式(否定)lookbehind 在 Firefox 中不起作用

IT技术 javascript regex firefox regex-lookarounds
2021-02-07 12:40:49

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

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

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

4个回答

2020 年 7 月 1 日更新

FireFox 78 版本开始RegExp最终支持lookbehinds、dotAlls标志、Unicode 转义序列和命名捕获,请参阅发行说明

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

非常感谢您,FireFox 开发人员!!!👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍


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

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

(?<!=)负回顾后确保没有=立即到当前位置的左侧。[^"]是与该字符匹配的原子(请注意,?量词使其成为可选的,但"之前[^"]不能是,=并且不需要限制该位置)。

所以,你可以使用

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

请注意,(?:[\"])它等于"[^"=]?匹配 1 或 0 次除"and以外的字符=

请参阅正则表达式演示

所以这两个正则表达式的工作方式相同,对吗?以前的正则表达式:(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>) 新的正则表达式:(?![^<]*>)"([^"=]*?)"(?!>)
2021-03-20 12:40:49
@Cla 如果不是,我就不会发布。
2021-03-29 12:40:49

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

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

您可以检查的建议在这里与浏览器支持在这里

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

完全等同于您的正则表达式 (?![^<]*>)"([^"]*?)(?<!=)"(?!>)

没有后视断言是:

(?![^<]*>)"((?:[^"=]+|=(?!"))*)"(?!>)

可读版本

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

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

@EugeneBarsky - 感谢您的错字修复。
2021-03-24 12:40:49

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