假设我要代表\q(或任何其他特定的"反斜杠转义字符")。 也就是说,我要匹配\q而不匹配\\q,因为后者是一个反斜杠转义的反斜杠,后跟一个q。 但是\\\q会匹配,因为它是一个反斜杠转义的反斜杠,后跟一个反斜杠转义的q。 (好吧,它会与结尾处的\q匹配,而不与开头的\\匹配。)
我知道我需要一个反面的眼神,但它们总是使我的头纠结,尤其是因为反斜杠本身必须在正则表达式中转义。
更新:
我新改进的Perl正则表达式,支持3个以上的反斜杠:
1 2 3 4
| /(?<!\\) # Not preceded by a single backslash
(?>\\\\)* # an even number of backslashes
\\q # Followed by a \q
/x; |
或者您的正则表达式库不支持扩展语法。
我的测试程序的输出:
1 2 3 4 5 6
| q does not match
\q does match
\\q does not match
\\\q does match
\\\\q does not match
\\\\\q does match |
旧版
1
| /(?:(?<!\\)|(?<=\\\\))\\q/ |
Leon Timmermans正是我想要的。对于以后来这里的人,我将做一个小改进:
(\\\\)组开头的附加?:使其不保存到任何匹配数据中。我无法想象要保存该文本的情况。
现在您有两个问题。
只需编写一个简单的解析器。如果正则表达式现在使您的头陷入困境,请等待一个月。
最好的解决方案是执行自己的字符串解析,因为正则表达式并不真正支持您要尝试执行的操作。 (rep @Frank Krueger,如果您采用这种方式,我只是在重复他的建议)
但是,我确实在排除正则表达式上开了一枪。这将匹配所有不符合您的条件的""后跟一个字符的字符串。
1
| (?:[\\][\\])(?!(([\\](?![\\])[a-zA-Z]))) |