我需要修改以下javascript正则表达式,因为它中的负向后看会在firefox中引发错误:
content = content.replace(/(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)/g, '„$1“');
有没有人有想法可以帮助我?
提前致谢!
答案 0 :(得分:7)
Lookbehinds仅适用于支持ECMA2018标准的浏览器,这意味着只有最新版本的Chrome才能处理它们。
要支持大多数浏览器,请将您的模式转换为仅使用前瞻。
(?<!=)
负面后卫确保当前位置左侧没有=
。 [^"]
是匹配该字符的原子(请注意?
量词使其成为可选字段,但"
之前的[^"]
不能=
并且没有必要限制那个位置)。
所以,你可以使用
content = content.replace(/(?![^<]>)"([^"=]?)"(?!>)/g, '„$1"');
^^^^^
请注意,(?:[\"])
等于"
。 [^"=]?
匹配除"
和=
以外的字符的1或0次匹配。
请参阅regex demo。
答案 1 :(得分:3)
正则表达式(?![^<]*>)"([^"]*?)(?<!=)"(?!>)
是:
(?![^<]*>)"((?:[^"=]+|=(?!"))*)"(?!>)
可读版本
(?! [^<]* > )
"
( # (1 start)
(?:
[^"=]+
|
=
(?! " )
)*
) # (1 end)
"
(?! > )
请注意,这与您选择的答案不同,后者不等效。
答案 2 :(得分:2)
Lookbehind断言是ES2018的一部分。 firefox尚未支持它们,这就是您收到错误的原因。
Chrome版本62支持Chrome,你可以在带有和声标志的Node.js&gt; = 6.4中使用它们,或者在没有任何标志的情况下使用&gt; = 9。
答案 3 :(得分:1)
2年后,Firefox终于迎头赶上。 ES2018 RegExp功能将包含在FF78中,该功能将于2020年6月底发布:https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/78#JavaScript