Javascript正则表达式中的(负向)后行断言在Firefox浏览器中无法工作

18

我需要修改下面的JavaScript正则表达式,因为其中的负回顾后置断言在火狐浏览器中会引发错误:

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

有人有想法并能帮助我吗?


你只需要把 = 移到否定字符类中,/(?![^<]>)"([^"=]?)"(?!>)/g - Wiktor Stribiżew
1
请在 https://bugzilla.mozilla.org/show_bug.cgi?id=1225665 上为 Firefox 的问题投票。 - bradlis7
@bradlis7 你怎么投票?(我很久没有登录bugzilla了,但我仍然看不到投票按钮。我开始关注它了-这是同样的事情吗?)而且这似乎是没有shim的少数事情之一。 - Darren Cook
2
@DarrenCook 登录后,在“详细信息面板”中,它显示“27 票 [投票]”。这是一个笨重的用户界面,因为您必须转到您的投票页面,检查问题,然后提交。 - bradlis7
也许很快就会实现:https://bugzilla.mozilla.org/show_bug.cgi?id=1634135 - mplungjan
4个回答

29

2020年7月1日更新

FireFox 78版本开始,RegExp终于支持向后查找、dotAll s标志、Unicode转义序列和命名捕获,请参见发行说明

在SpiderMonkey中添加了新的RegExp引擎,支持点全标志、Unicode转义序列、向后查找的引用和命名捕获。

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


只有支持ECMA2018标准的浏览器才支持向后查找,这意味着只有Chrome的最新版本才能处理它们。

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

(?<!=)负向后瞻确保当前位置左侧没有=[^"]是匹配该字符的原子(请注意,?量词使其变为可选项,但是位于[^"]之前的"不能是=,并且无需限制该位置)。

因此,您可以使用以下内容:

content = content.replace(/(?![^<]>)"([^"=]?)"(?!>)/g, '„$1"');                                      ^^^^^
请注意,(?:[\"])等同于"[^"=]?匹配除了"=之外的一个字符出现1次或0次。

查看正则表达式演示


所以这两个正则表达式的作用是相同的,对吗?之前的正则表达式: (?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)新的正则表达式: (?![^<]*>)"([^"=]*?)"(?!>) - Cla
@Cla 如果不是这样,我就不会发帖了。 - Wiktor Stribiżew

2

你的正则表达式(?![^<]*>)"([^"]*?)(?<!=)"(?!>)的确切等价物,不带lookbehind断言是:

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

易读版本:

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

请注意,这与您选择的答案不同,后者不是等价的。

1
@EugeneBarsky - 感谢您纠正拼写错误。 - user557597

2
回顾断言是 ES2018 的一部分。 Firefox 尚不支持它们,这就是为什么出现错误的原因。
Chrome 从版本 62 开始支持它们,您可以在带有 Harmony 标志的 Node.js >= 6.4 中使用它们,或者在 >= 9 中无需任何标志即可使用。
您可以在此处检查提案 here 和浏览器支持情况 here

你知道这个问题的解决方法吗?我正在尝试重写正则表达式,但不知道如何去掉lookbehind。 - Cla
请发布您想要匹配的文本和期望结果,我们将能够帮助您。 - Marcos Casagrande
在Firefox 69中仍不支持:https://caniuse.com/#feat=js-regexp-lookbehind - Lonnie Best
仍不支持Firefox 77.0.1(64位)。进展棒极了! - Dan Dascalescu

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接