我需要修改下面的JavaScript正则表达式,因为其中的负回顾后置断言在火狐浏览器中会引发错误:
content = content.replace(/(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)/g, '„$1“');
有人有想法并能帮助我吗?
我需要修改下面的JavaScript正则表达式,因为其中的负回顾后置断言在火狐浏览器中会引发错误:
content = content.replace(/(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)/g, '„$1“');
有人有想法并能帮助我吗?
2020年7月1日更新
从FireFox 78版本开始,RegExp
终于支持向后查找、dotAll s
标志、Unicode转义序列和命名捕获,请参见发行说明:
在SpiderMonkey中添加了新的RegExp引擎,支持点全标志、Unicode转义序列、向后查找的引用和命名捕获。
非常感谢,FireFox开发人员!!!
只有支持ECMA2018标准的浏览器才支持向后查找,这意味着只有Chrome的最新版本才能处理它们。
为了支持大多数浏览器,请将您的模式转换为仅使用前瞻。
(?<!=)
负向后瞻确保当前位置左侧没有=
。 [^"]
是匹配该字符的原子(请注意,?
量词使其变为可选项,但是位于[^"]
之前的"
不能是=
,并且无需限制该位置)。
因此,您可以使用以下内容:
content = content.replace(/(?![^<]>)"([^"=]?)"(?!>)/g, '„$1"'); ^^^^^
请注意,(?:[\"])
等同于"
。 [^"=]?
匹配除了"
和=
之外的一个字符出现1次或0次。查看正则表达式演示。
(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)
新的正则表达式:
(?![^<]*>)"([^"=]*?)"(?!>)
- Cla你的正则表达式(?![^<]*>)"([^"]*?)(?<!=)"(?!>)
的确切等价物,不带lookbehind断言是:
(?![^<]*>)"((?:[^"=]+|=(?!"))*)"(?!>)
易读版本:
(?! [^<]* > )
"
( # (1 start)
(?:
[^"=]+
|
=
(?! " )
)*
) # (1 end)
"
(?! > )
两年后,Firefox终于迎头赶上。由于将于2020年6月底发布的FF78中包含ES2018 RegExp特性:https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/78#JavaScript
=
移到否定字符类中,/(?![^<]>)"([^"=]?)"(?!>)/g
。 - Wiktor Stribiżew