如何在没有负面回顾的情况下不匹配 RegEx 中的给定前缀?

How to not match given prefix in RegEx without negative lookbehind?

目标

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

总结:

使用负后视的解决方案

一个完美达到这个目的的方案是:(?<!\)$(.*?)(?<!\)$.

问题

此解决方案使用负向回顾Safari不支持它。如何在不使用负面回顾的情况下(即在 Safari 上)实现相同的匹配?


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

,这也会匹配该字符

您可以通过匹配排除您不想要的,并捕获您想要保留的第 1 组

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

Regex demo

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

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

RegEx Demo

正则表达式详细信息:

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

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