【问题标题】:Convert JS regex to not use lookbehind将 JS 正则表达式转换为不使用lookbehind
【发布时间】:2021-04-06 21:56:54
【问题描述】:

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

这里有几个例子https://regex101.com/r/Y1Uml9/1/

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

关于如何转换正则表达式使其在 iOS 上运行有什么建议吗?

【问题讨论】:

  • 应该是/(?:^|[^\\])(?:\\\\)*\$([^\\$]*(?:\\[\w\W][^\\$]*)*)\$/g (demo)。
  • @WiktorStribiżew 感谢工作几乎完美。 This 还匹配第一个 $ 之前的空格或字符(您可以从 regex101 的最后一行看到这一点)。你可以修改它,使它不会在 $ 之前捕获那个字符或空格吗?
  • 不,没有必要“不抓住那个角色”。您无需担心这一点。您需要担心的是:您是 1) 提取匹配项还是 2) 替换匹配项?还是 3) 分裂?
  • 我正在用其他东西替换匹配项 - 整个 $match here$。这就是为什么我需要在放置替换字符串之前保留空格或任何字符,否则生成的文本会看起来很奇怪
  • 那么,像this?

标签: javascript regex


【解决方案1】:

你可以使用

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

请参阅regex demo

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

详情

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

查看 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>>') );

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 2017-12-29
    • 2017-12-15
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多