首页 > 解决方案 > 将 JS 正则表达式转换为不使用lookbehind

问题描述

在我从事的 Web 项目开发的早期,我创建了这个正则表达式/(?<!\\)\w?\$.+?(?<!\\)\$/$ any text here$只要第一个和最后一个$前面没有\.

此处显示了一些示例https://regex101.com/r/Y1Uml9/1/

正则表达式完美运行,直到我意识到 iOS Safari 和 Chrome 不支持后视。我尝试自己修改正则表达式,但我的基本正则表达式技能无法生成有效的正则表达式。

有什么建议如何转换正则表达式使其在 iOS 上工作?

标签: javascriptregex

解决方案


您可以使用

/((?:^|[^\\])(?:\\\\)*)\$([^\\$]*(?:\\[\w\W][^\\$]*)*)\$/g

请参阅正则表达式演示

基本上,捕获“实际”匹配之前的部分,捕获替换时需要保留的匹配部分。

详情

  • ((?:^|[^\\])(?:\\\\)*)- 第 1 组:字符串开头或除双反斜杠之外的任何字符\,然后是零次或多次重复
  • \$- 一个$字符
  • ([^\\$]*(?:\\[\w\W][^\\$]*)*)- 第 2 组:
    • [^\\$]*\- 除了and之外的零个或多个字符$
  • (?:\\[\w\W][^\\$]*)*- 零次或多次重复
    • \\[\w\W]- a\后跟任何字符
    • [^\\$]*\- 除了and之外的零个或多个字符$
  • \$- 一个$字符

查看 JavaScript 演示:

const regex = /((?:^|[^\\])(?:\\\\)*)\$([^\\$]*(?:\\[\w\W][^\\$]*)*)\$/g;
const str = String.raw`$ some test here$
$ some text here with inner \$ $
\$ this should not be matched\$`;
console.log( str.replace(regex, '$1<<START>>$2<<END>>') );


推荐阅读