匹配的Ruby正则表达式除非转义为\

时间:2011-09-13 11:40:23

标签: ruby regex lookbehind

识别以下内容:

[stack][overflow]
or
[is great!]

我做:

/\[([^\]]+)\](\[([^\]]+)\])?/.match(s)

现在我想对此进行扩展,以便[...][...][...]位于\之后,将无法识别:

\[stack][overflow]   # => Should not match
\[is great!]         # => Should not match
a \[b][c] \[d] [e]   # => Should match [e]

我怎样才能扩展正则表达式来实现这个目标?

它应该在Ruby 1.9.2和Ruby 1.8.7中都有用。

2 个答案:

答案 0 :(得分:3)

您可以这样做:

/(^|[^\\\]])(\\\\)*(\[([^\]]+)\]){1,2}/

(已添加(^|[^\\])(\\\\)*

这可以通过匹配主题字符串的开头(如果[之前没有任何内容)或除\之外的任何字符,后跟任意数量的转义\\

[1]       => yes
[1][2]    => yes
x[1]      => yes
x[1][2]   => yes
\[1]      => no
\[1][2]   => no
\\[1]     => yes
\\[1][2]  => yes
\\\[1]    => no
\\\\[1]   => yes
\\\\\[1]  => no
\\\\\\[1] => yes    
...

在此处试试:http://rubular.com/r/ST9qOVjUXe

答案 1 :(得分:3)

我想出了这个正则表达式:

/([^\\\[\]]|^)\[([^\]]+)\](\[([^\]]+)\])?/

你可以在这里试试:

http://rubular.com/r/L796M2pcG7

希望有所帮助。

编辑:对你的评论作出反应 编辑:下一个