2010-03-08 5 views
233

Простое задание регулярного выражения. У меня есть строка на следующем формате:Регулярное выражение для извлечения текста между квадратными скобками

this is a [sample] string with [some] special words. [another one] 

Что такое регулярное выражение для извлечения слова в квадратных скобках, то есть.

sample 
some 
another one 

Примечание: В моем варианте использования скобки не могут быть вложенными.

ответ

472

Вы можете использовать следующее регулярное выражение глобально:

\[(.*?)\] 

Пояснение:

  • \[: [ является мета голец и нужно экранировать, если вы хотите, чтобы соответствовать его буквально.
  • (.*?): все, что не жадным, сочетать и захватывать.
  • \]: ] является метасимволом и должен быть экранирован, если вы хотите совместить его буквально.
+6

Метод другого ответа с использованием '[^]]' быстрее, чем не-жадный ('?'), А также работает с ароматами регулярных выражений, которые не поддерживают не-жадные. Однако не жадный выглядит лучше. – Ipsquiggle

+0

@Ipsquiggle Вы правы sir :) – StErMi

+92

Как исключить '[' ']' из результата (результата)? –

65

Это должно работать нормально:

\[([^]]+)\] 
+3

В моем примере использования текст в квадратных скобках может включать в себя новые строки, и это регулярное выражение работает, а принятый ответ - нет. – Dave

+1

Что означает класс персонажа [^]]? С чем это связано? – Richard

+2

@Richard, The^отрицает класс символов. Это означает «любой символ, который не является». – jasonbar

28

Может быть вложенными скобками?

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

(?<=\[)[^]]+(?=\]) 

Это будет соответствовать только изделию внутри скобок.

+0

Это только отмечает первое появление –

+0

@KunalMukherjee: Нет, регулярное выражение может соответствовать любому количеству раз. Но для некоторых регулярных выражений необходимо явно указывать повторное применение регулярного выражения (например, с помощью флага '/ g' в JavaScript). –

1
([[][a-z \s]+[]]) 

Выше должны работать с учетом следующих Explaination

  • символов в квадратных скобках [] определяет характ класса, который означает, что шаблон должен соответствовать по крайней мере один charcater упоминается в квадратных скобках

  • \ с указывает пробел

  • + означает atleast one упомянутого ранее символа +.

+0

В чувствительных случаях 'A-Z' следует добавить к шаблону:' ([[] [a-zA-Z \ s] + []]) '; Я думаю, что это хороший способ, в то время как '\' в шаблонах регулярных выражений, которые определяют в строковых меток («и») и смешивании новичков с помощью обратного слэша в «или» обычаях! – MohaMad

36
(?<=\[).+?(?=\]) 

будет захватывать содержимое без скобок

(< = [?) - положительный для просмотра назад [

*.? - не жадное соответствие для содержания

(?=]) - положительный предпросмотр для [

EDIT: для вложенных скобок ниже регулярное выражение должно работать:

(\[(?:\[??[^\[]*?\])) 
+2

@igaurav Я проверил его, и он работает. Однако он не будет работать в средах, которые не поддерживают lookbehinds как Javascript. Может, это ваш случай? –

+0

Адам, ваше решение вложенных скобок не работает, когда есть строка с '.' в ней ... – patrick

3

Этот код будет извлечь содержимое в квадратные скобки и круглые скобки

(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\])) 

(?: non capturing group 
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses 
| or 
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets 
6

(?<=\().*?(?=\)) работы хорошо в соответствии с приведенным выше объяснением. Вот пример Python:

import re 
str = "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')" 
re.search('(?<=\().*?(?=\))', str).group() 
"'formPagination_bottom',2,'Page',true,'1',null,'2013'" 
+1

Вы всегда должны использовать форматирование кода для регулярных выражений, где бы они ни появлялись. Если регулярное выражение находится в тексте, а не в блоке кода, вы можете использовать обратные ссылки для их форматирования. ([ref] (http://stackoverflow.com/editing-help#comment-formatting)) –

+0

Кроме того, вопрос касался квадратных скобок ('[]'), а не круглых скобок. –

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