如何在没有负面回顾的情况下不匹配 RegEx 中的给定前缀?
How to not match given prefix in RegEx without negative lookbehind?
目标
目标是匹配 JavaScript 中没有特定分隔符的字符串,即两个字符 之间的字符串 (字符可以包含在匹配中)。
例如,这个字符串应该完全匹配:$ test string $
。这可以出现在字符串中的任何位置。这将是微不足道的,但是,我们希望允许转义语法,例如The price is 5$ to 10$
.
总结:
- 匹配由两个
$
符号括起来的任何字符串。
- 如果美元符号使用
$
进行转义,则不匹配它。
使用负后视的解决方案
一个完美达到这个目的的方案是:(?<!\)$(.*?)(?<!\)$
.
问题
此解决方案使用负向回顾,Safari不支持它。如何在不使用负面回顾的情况下(即在 Safari 上)实现相同的匹配?
部分有效的解决方案是(?<!\)$(.*?)(?<!\)$
。但是,如果 $
符号前面的字符不是 \
.
,这也会匹配该字符
您可以通过匹配排除您不想要的,并捕获您想要保留的第 1 组
\$.*?$|$.*?\$|($.*?$)
您可以使用此正则表达式并使用捕获组 #1 获取您的内部文本,就像您在当前正则表达式中使用 lookbehind 所做的那样:
(?:^|[^\])$((?:\.|[^$])*)$
正则表达式详细信息:
(?:^|[^\])
: 匹配起始位置或非捕获组中的非反斜杠字符
$
: 比赛开始 $
(
: 开始抓包
(?:\.|[^$])*
:匹配任何转义字符或非$
字符。重复此组 0 次或更多次
)
: 结束捕获组
$
:比赛结束$
PS:此正则表达式将给出与当前正则表达式相同的匹配项:(?<!\)$(.*?)(?<!\)$
目标
目标是匹配 JavaScript 中没有特定分隔符的字符串,即两个字符 之间的字符串 (字符可以包含在匹配中)。
例如,这个字符串应该完全匹配:$ test string $
。这可以出现在字符串中的任何位置。这将是微不足道的,但是,我们希望允许转义语法,例如The price is 5$ to 10$
.
总结:
- 匹配由两个
$
符号括起来的任何字符串。 - 如果美元符号使用
$
进行转义,则不匹配它。
使用负后视的解决方案
一个完美达到这个目的的方案是:(?<!\)$(.*?)(?<!\)$
.
问题
此解决方案使用负向回顾,Safari不支持它。如何在不使用负面回顾的情况下(即在 Safari 上)实现相同的匹配?
部分有效的解决方案是(?<!\)$(.*?)(?<!\)$
。但是,如果 $
符号前面的字符不是 \
.
您可以通过匹配排除您不想要的,并捕获您想要保留的第 1 组
\$.*?$|$.*?\$|($.*?$)
您可以使用此正则表达式并使用捕获组 #1 获取您的内部文本,就像您在当前正则表达式中使用 lookbehind 所做的那样:
(?:^|[^\])$((?:\.|[^$])*)$
正则表达式详细信息:
(?:^|[^\])
: 匹配起始位置或非捕获组中的非反斜杠字符$
: 比赛开始$
(
: 开始抓包(?:\.|[^$])*
:匹配任何转义字符或非$
字符。重复此组 0 次或更多次
)
: 结束捕获组$
:比赛结束$
PS:此正则表达式将给出与当前正则表达式相同的匹配项:(?<!\)$(.*?)(?<!\)$