我在正则表达式中嵌套'+'/'-'lookahead/lookbehead时遇到问题。
假设我想用'*'
更改字符串中的'%'
,并且说'\'
转义了下一个字符。 (将正则表达式转换为类似命令^^的sql)。
所以字符串
'*test*'
应该更改为'%test%'
,'\\*test\\*'
-> '\\%test\\%'
,但'\*test\*'
和'\\\*test\\\*'
应该保持相同。 我试过了:
(?<!\\)(?=\\\\)*\* but this doesn't work
(?<!\\)((?=\\\\)*\*) ...
(?<!\\(?=\\\\)*)\* ...
(?=(?<!\\)(?=\\\\)*)\* ...
与上述示例中的*匹配的正确正则表达式是什么?
(?<!\\(?=\\\\)*)\*
和(?=(?<!\\)(?=\\\\)*)\*
之间有什么区别,或者如果它们本质上是错误的,则具有这种视觉构造的正则表达式之间的区别是什么?
最佳答案
要查找一个未转义的字符,您将寻找一个以偶数个(或零个)转义字符开头的字符。这是相对简单的。
(?<=(?<!\\)(?:\\\\)*)\* # this is explained in Tim Pietzcker' answer
不幸的是,许多正则表达式引擎不支持可变长度后向查找,因此我们必须用前向查找代替:
(?=(?<!\\)(?:\\\\)*\*)(\\*)\* # also look at ridgerunner's improved version
将其替换为组1的内容和一个
%
符号。解释
(?= # start look-ahead
(?<!\\) # a position not preceded by a backslash (via look-behind)
(?:\\\\)* # an even number of backslashes (don't capture them)
\* # a star
) # end look-ahead. If found,
( # start group 1
\\* # match any number of backslashes in front of the star
) # end group 1
\* # match the star itself
前瞻确保仅考虑偶数个反斜杠。无论如何,没有办法将它们匹配到一个组中,因为前瞻不会使字符串中的位置前进。
关于regex - 嵌套正则表达式向前和向后看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7867179/