Ruby регулярное выражение, которое соответствует, если не экранировано с \

Чтобы определить такие вещи, как:

[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 ответа

Решение

Я придумал это регулярное выражение:

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

Вы можете попробовать это здесь:

http://rubular.com/r/L796M2pcG7

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: отреагировал на ваш комментарий РЕДАКТИРОВАТЬ: следующий

Вы можете сделать это вместо этого:

/(^|[^\\\]])(\\\\)*(\[([^\]]+)\]){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

Другие вопросы по тегам