2016-11-28 6 views
1

Мне нужно извлечь выражение между скобками, которое может включать все, но не закрытое скобкой без экранирования.Исключить экранированный символ из диапазона

Например, регулярное выражение от [aaa\]bbbbbb] должно указывать в результате: aaa\]bbbbbb.

Я пробовал: \[([^(?<!\\)\]]*)\] но это не работает.

Любые подсказки?

+0

Awesome, спасибо! Я получу некоторое время, чтобы понять объяснение со страницы инструмента :) – sssimon

ответ

1

Вы можете использовать

\[([^\]\[\\]*(?:\\.[^\]\[\\]*)*)] 

Или - если может быть любой не спасся [ в-между не маскирование [ и ] (например [a[\[aa\]bbbbbba\[aabbbbbb]), вывезти \[:

\[([^\]\\]*(?:\\.[^\]\\]*)*)] 

См. regex demo 1 и regex demo 2. Это unrolled variant регулярного выражения \[((?:[^][\\]|\\.)*)].

Детали:

  • \[ - это [
  • ([^\]\[\\]*(?:\\.[^\]\[\\]*)*) - Группа 1 отлов:
    • [^\]\[\\]* - ноль или больше символов, кроме [, ] и \ (в некоторых регулярных выражений вкусов , вы можете написать его без побегов - [^][\\]*)
    • (?:\\.[^\]\[\\]*)* - ноль или более последовательности:
      • \\. - любая ушедшей последовательность (\ и любой символ, отличный от символов разрыва строки
      • [^\]\[\\]* - ноль или более символов другого, чем [, ] и \
  • ] - закрытие ].
+0

Ваше регулярное выражение не сработает против чего-то вроде '[a [\ [aa \] bbbbbba \ [aabbbbbb]' (с другой скобой открытия в скобках) – Aserre

+0

@Aserre : Конечно, потому что unescaped '[' и ']' не сбалансированы. Не упоминается, какое поведение должно быть для этих сценариев в OP. –

+0

'Мне нужно извлечь выражение между скобками, которое может включать в себя все, но не неэкспериментированную закрытую скобку.' :) – Aserre

0

Это самое простое, что регулярное выражение (я думаю) работает:

\[(.*?)(?<!\\)\] 

, который захватывает текст в квадратных скобках в качестве группы 1.

См live demo.

Смежные вопросы