Javascript正则表达式负面lookbehind在firefox中不起作用

时间:2018-04-24 22:08:09

标签: javascript regex firefox regex-lookarounds

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

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

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

提前致谢!

4 个答案:

答案 0 :(得分:7)

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

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

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

所以,你可以使用

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

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

请参阅regex demo

答案 1 :(得分:3)

正则表达式(?![^<]*>)"([^"]*?)(?<!=)"(?!>)

的完全等价物 没有lookbehind断言的

是:

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

可读版本

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

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

答案 2 :(得分:2)

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

Chrome版本62支持Chrome,你可以在带有和声标志的Node.js&gt; = 6.4中使用它们,或者在没有任何标志的情况下使用&gt; = 9。

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

答案 3 :(得分:1)

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