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“');
有没有人有想法可以帮助我?
【问题讨论】:
您只需将=
移动到否定字符类/(?![^<]>)"([^"=]?)"(?!>)/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 才能处理它们。
要支持大多数浏览器,请将您的模式转换为仅使用前瞻。
(?<!=)
否定后向查看确保当前位置左侧没有=
。 [^"]
是与该字符匹配的原子(请注意,?
量词使其可选,但在 [^"]
之前的 "
不能是 =
并且没有必要限制该位置)。
所以,你可以使用
content = content.replace(/(?![^<]>)"([^"=]?)"(?!>)/g, '„$1"');
^^^^^
注意(?:[\"])
等于"
。 [^"=]?
匹配除 "
和 =
之外的 1 或 0 次出现的字符。
请参阅regex demo。
【讨论】:
所以这两个正则表达式的工作方式相同,对吧?以前的正则表达式:(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)
新的正则表达式:(?![^<]*>)"([^"=]*?)"(?!>)
@Cla 如果不是我就不会发帖了。【参考方案3】:
与您的正则表达式 (?![^<]*>)"([^"]*?)(?<!=)"(?!>)
完全等价
没有后向断言是:
(?![^<]*>)"((?:[^"=]+|=(?!"))*)"(?!>)
可读版本
(?! [^<]* > )
"
( # (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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章