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