假设我想表示\q
(或任何其他特定的“反斜杠转义字符”)。也就是说,我想匹配\q
但不匹配\\q
,因为后者是一个反斜杠转义的反斜杠,后跟一个q
. 然而\\\q
会匹配,因为它是一个反斜杠转义的反斜杠,后跟一个反斜杠转义的q
. (嗯,它会匹配\q
结尾的,而不是\\
开头的。)
我知道我需要一个消极的向后看,但他们总是把我的头打成结,特别是因为反斜杠本身必须在正则表达式中转义。
假设我想表示\q
(或任何其他特定的“反斜杠转义字符”)。也就是说,我想匹配\q
但不匹配\\q
,因为后者是一个反斜杠转义的反斜杠,后跟一个q
. 然而\\\q
会匹配,因为它是一个反斜杠转义的反斜杠,后跟一个反斜杠转义的q
. (嗯,它会匹配\q
结尾的,而不是\\
开头的。)
我知道我需要一个消极的向后看,但他们总是把我的头打成结,特别是因为反斜杠本身必须在正则表达式中转义。
更新:我的新的和改进的 Perl 正则表达式,支持超过 3 个反斜杠:
/(?<!\\) # 前面没有一个反斜杠 (?>\\\\)* # 偶数个反斜杠 \\q # 后跟一个 \q /X;
或者如果您的正则表达式库不支持扩展语法。
/(?<!\\)(?>\\\\)*\\q/
我的测试程序的输出:
q 不匹配 \q 匹配 \\q 不匹配 \\\q 匹配 \\\\q 不匹配 \\\\\q 匹配
旧版本
/(?:(?<!\\)|(?<=\\\\))\\q/
Leon Timmermans得到了我想要的东西。我会为以后来这里的人添加一个小改进:
/(?<!\\)(?:\\\\)*\\q/
?:
组开头的附加项(\\\\)
使其不保存到任何匹配数据中。我无法想象我想要保存文本的场景。
只需编写一个简单的解析器。如果正则表达式现在把你的头打结了,那就等一个月。
最好的解决方案是进行自己的字符串解析,因为正则表达式并不真正支持您正在尝试做的事情。(代表@Frank Krueger,如果你这样做,我只是重复他的建议)
但是,我确实对排除性正则表达式进行了尝试。这将匹配所有不符合您的“\”标准的字符串,后跟一个字符。
(?:[\\][\\])(?!(([\\](?![\\])[a-zA-Z])))