我想建立一个正则表达式,以匹配代表$
正则表达式的字符串中的所有未转义的内容。
在这种情况下,如果字符后面包含相同数量的反斜杠,则该字符不会被转义(每对反斜杠代表反斜杠字符本身,因此下一个字符不会被转义)。
我想出了这个模式:
(?<!\\)(\\{2})*\$
解释:虽然这也会匹配 前面的反斜杠$
,但这是我找到的最接近的解决方案。这确保了 前面的反斜杠数量相等,$
而 前面没有其他反斜杠,因此反斜杠数量为奇数。
我的问题是,似乎我需要 2 个连续的非消耗组才能使反斜杠总数相等,但这是不可能的。还有其他方法可以做到这一点吗?
使用 PCRE 实现此目的的一种方法是使用动词序列避免所有以反斜杠开头的字节
(*SKIP)(*FAIL)
,并在另一个分支中捕获美元符号:演示
不要忘记,为了正确计算正则表达式模式中引用的 PHP 字符串中的文字反斜杠,必须对它进行两次转义(一次用于正则表达式,因为它是形成转义序列的特殊字符,如
\w
或\$
,一次用于引用的字符串,因为这个相同的字符也用于形成转义序列,如\'
),因此需要 4 个反斜杠来计算单个文字反斜杠:演示
nowdoc 字符串避免使用引用字符串反斜杠:
使重复组不捕获,并添加元转义
\K
。这是Regex101上的内容。
如果您不能使用
\K
and(*SKIP*)(*FAIL*)
语法,例如在Python (和许多其他正则表达式)中,那么您可以。逻辑: 组 1 (
$1
) 将使用并捕获匹配所需的前导字符。组 2 ($2
) 将使用并捕获未转义的$
,\$
,其前面有 0 个或其他偶数个文字反斜杠\
。正则表达式模式:
替换字符串:
正则表达式演示: https://regex101.com/r/qq0Bug/2
测试字符串:
结果:
比赛和小组:
正则表达式注意事项:
(
开始捕获组 1$1
,在替换字符串中 引用。[^\\]
否定字符类[^...]
。匹配任何非文字反斜杠的字符\
。(?:\\\\)*
非捕获组(?:...)
。匹配两个连续的文字反斜杠字符\\
0 次或更多*
次( )。)
端组 1(\$)
第 2 组($2
)与文字匹配$
。