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

时间:2020-03-05 18:51:27  来源:igfitidea点击:

假设我要代表" \ q"(或者其他任何特殊的"反斜杠转义字符")。也就是说,我想匹配\ q而不匹配\\ q,因为后者是一个反斜杠转义的反斜杠,后跟一个q。然而\\ q会匹配,因为它是一个反斜杠转义的反斜杠,后跟一个反斜杠转义的q`。 (好吧,它将与结尾处的\ q匹配,而不与开头的\相匹配。)

我知道我需要一个反面的眼神,但是它们总是使我的头纠结,尤其是因为反斜杠本身必须在正则表达式中转义。

解决方案

回答

现在我们有两个问题。

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

回答

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

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

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

回答

更新:
我的新的和改进的Perl正则表达式,支持3个以上的反斜杠:

/(?<!\)    # Not preceded by a single backslash
  (?>\\)* # an even number of backslashes
  \q       # Followed by a \q
  /x;

或者正则表达式库不支持扩展语法。

/(?<!\)(?>\\)*\q/

我的测试程序的输出:

q does not match
\q does match
\q does not match
\\q does match
\\q does not match
\\\q does match

较旧的版本

/(?:(?&lt;!\)|(?&lt;=\\))\q/

回答

莱昂·蒂默曼斯(Leon Timmermans)正是我想要的。对于后来来到这里的人,我要添加一个小改进:

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

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