字符前未转义的反斜杠的正确正则表达式是什么?
时间: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
较旧的版本
/(?:(?<!\)|(?<=\\))\q/
回答
莱昂·蒂默曼斯(Leon Timmermans)正是我想要的。对于后来来到这里的人,我要添加一个小改进:
/(?<!\)(?:\\)*\q/
在(\\))组开头的添加?:
使其不保存到任何匹配数据中。我无法想象要保存该文本的情况。