11

假设我想表示\q(或任何其他特定的“反斜杠转义字符”)。也就是说,我想匹配\q但不匹配\\q,因为后者是一个反斜杠转义的反斜杠,后跟一个q. 然而\\\q会匹配,因为它是一个反斜杠转义的反斜杠,后跟一个反斜杠转义的q. (嗯,它会匹配\q结尾的,而不是\\开头的。)

我知道我需要一个消极的向后看,但他们总是把我的头打成结,特别是因为反斜杠本身必须在正则表达式中转义。

4

4 回答 4

19

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

/(?<!\\) # 前面没有一个反斜杠
  (?>\\\\)* # 偶数个反斜杠
  \\q # 后跟一个 \q
  /X;

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

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

我的测试程序的输出:

q 不匹配
\q 匹配
\\q 不匹配
\\\q 匹配
\\\\q 不匹配
\\\\\q 匹配

旧版本

/(?:(?<!\\)|(?<=\\\\))\\q/
于 2008-09-11T14:25:06.177 回答
3

Leon Timmermans得到了我想要的东西。我会为以后来这里的人添加一个小改进:

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

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

于 2008-09-11T15:12:47.077 回答
0

现在你有两个问题

只需编写一个简单的解析器。如果正则表达式现在把你的头打结了,那就等一个月。

于 2008-09-11T13:52:04.667 回答
-1

最好的解决方案是进行自己的字符串解析,因为正则表达式并不真正支持您正在尝试做的事情。(代表@Frank Krueger,如果你这样做,我只是重复他的建议)

但是,我确实对排除性正则表达式进行了尝试。这将匹配所有不符合您的“\”标准的字符串,后跟一个字符。

(?:[\\][\\])(?!(([\\](?![\\])[a-zA-Z])))
于 2008-09-11T14:24:01.093 回答