关于正则表达式:对于字符前未转义的反斜杠,正确的正则表达式是什么?

关于正则表达式:对于字符前未转义的反斜杠,正确的正则表达式是什么?

What is the proper regular expression for an unescaped backslash before a character?

假设我要代表\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
/(?<!\\)(?>\\\\)*\\q/

我的测试程序的输出:

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正是我想要的。对于以后来这里的人,我将做一个小改进:

1
/(?<!\\)(?:\\\\)*\\q/

(\\\\)组开头的附加?:使其不保存到任何匹配数据中。我无法想象要保存该文本的情况。


现在您有两个问题。

只需编写一个简单的解析器。如果正则表达式现在使您的头陷入困境,请等待一个月。


最好的解决方案是执行自己的字符串解析,因为正则表达式并不真正支持您要尝试执行的操作。 (rep @Frank Krueger,如果您采用这种方式,我只是在重复他的建议)

但是,我确实在排除正则表达式上开了一枪。这将匹配所有不符合您的条件的""后跟一个字符的字符串。

1
(?:[\\][\\])(?!(([\\](?![\\])[a-zA-Z])))


推荐阅读