我需要修改以下 javascript 正则表达式,因为其中的负向后视会在 firefox 中引发错误:
content = content.replace(/(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)/g, '„$1“');
有没有人有想法并且可以帮助我?
我需要修改以下 javascript 正则表达式,因为其中的负向后视会在 firefox 中引发错误:
content = content.replace(/(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)/g, '„$1“');
有没有人有想法并且可以帮助我?
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以外的字符=
。
请参阅正则表达式演示。
完全等同于您的正则表达式 (?![^<]*>)"([^"]*?)(?<!=)"(?!>)
没有后视断言是:
(?![^<]*>)"((?:[^"=]+|=(?!"))*)"(?!>)
可读版本
(?! [^<]* > )
"
( # (1 start)
(?:
[^"=]+
|
=
(?! " )
)*
) # (1 end)
"
(?! > )
请注意,这与您选择的答案不同,它不是等效的 .
2 年后,Firefox 终于迎头赶上。ES2018 RegExp 功能将包含在 FF78 中,将于 2020 年 6 月底发布:https : //developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/78#JavaScript