【问题标题】:How to not match given prefix in RegEx without negative lookbehind?如何在没有负面后视的情况下不匹配 RegEx 中的给定前缀?
【发布时间】:2021-07-23 17:01:24
【问题描述】:

目标

目标是匹配 JavaScript 中没有特定分隔符的字符串,即两个字符之间的字符串(字符可以包含在匹配中)。
例如,此字符串应完全匹配:$ test string $。这可以出现在字符串中的任何位置。这将是微不足道的,但是,我们希望允许转义语法,例如The price is 5\$ to 10\$.

总结:

  • 匹配任何由两个$ 符号括起来的字符串。
  • 如果使用\$ 转义美元符号,则不要匹配它。

使用否定后向的解决方案

完美实现这一目标的解决方案是:(?<!\\)\$(.*?)(?<!\\)\$

问题

此解决方案使用 negative lookbehindSafari 不支持。如何在不使用否定后视(即在 Safari 上)的情况下实现相同的匹配?


部分有效的解决方案是(?<!\\)\$(.*?)(?<!\\)\$。但是,如果$ 符号前面的字符不是\,这也会匹配它。

【问题讨论】:

  • 这最终是否是一个 JavaScript 问题,或者如果不是,那么这里使用的语言是什么?
  • 为什么不使用简单的/\$([^$]+)\$/
  • @TimBiegeleisen 是的,我应该指定 - JavaScript。这也是它不能在 Safari 上运行的原因。
  • @Akxe 这仍然会匹配$foo\$,但更糟糕的是,它将匹配\$bar$$bar$ 将匹配不带反斜杠)。目标是在使用反斜杠转义美元符号时匹配字符串。
  • 好吧...那为什么不\\\$([^$]+)\\\$?然后只需从那里提取您想要的组...

标签: javascript regex safari regex-negation


【解决方案1】:

您可以使用此正则表达式并使用捕获组#1 来获取您的内部文本,就像您在当前正则表达式中使用lookbehind 所做的那样:

(?:^|[^\\])\$((?:\\.|[^$])*)\$

RegEx Demo

正则表达式详细信息:

  • (?:^|[^\\]):匹配非捕获组中的起始位置或非反斜杠字符
  • \$:比赛开始$
  • (: 开始抓包
    • (?:\\.|[^$])*:匹配任何转义字符或非$ 字符。重复此组 0 次或多次
  • ):结束抓包
  • \$:比赛结束$

PS:此正则表达式将提供与您当前正则表达式相同的匹配项:(?<!\\)\$(.*?)(?<!\\)\$

【讨论】:

  • 谢谢,但是,这样做的缺点是匹配将包含$ 之前的字符。这与我在问题中提到的相同。这可能会干扰替换整个匹配项的逻辑。
  • 是的,如果我们有像$ one $$ two $ 这样的输入,那么第二个将不会与这个匹配。但是您向后看,正则表达式也在使用$ 之间的文本捕获组,这个也是。
  • @creativecreatorormaybenot:This is the same I mentioned in the question:你确定你提供的有问题吗?因为我只看到(?<!\\)\$(.*?)(?<!\\)\$ 被提及两次,这是基于后视的,并且在匹配之前不匹配字符。
  • 如果你的意图是替换,那么我建议this solution
【解决方案2】:

您可能会通过匹配来排除您不想要的内容,然后将您想要保留在第 1 组中的内容捕获

\\\$.*?\$|\$.*?\\\$|(\$.*?\$)

Regex demo

【讨论】:

  • 我非常喜欢这种方法。必须看看这是否适合用例(因为在某种意义上,多个正则表达式在单个字符串上竞争,并且“不需要的”匹配可能会干扰),但这似乎很有希望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2021-08-11
相关资源
最近更新 更多