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

294

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

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

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

sample
some
another one

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

Теги:

8 ответов

544
Лучший ответ

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

\[(.*?)\]

Пояснение:

  • \[: [ является мета-символом char и должен быть экранирован, если вы хотите совместить его буквально.
  • (.*?): сопоставлять все неживым способом и захватывать его.
  • \]: ] является мета-символом char и должен быть экранирован, если вы хотите совместить его буквально.
  • 6
    Метод другого ответа, использующий [^]] быстрее, чем не жадный ( ? ), А также работает с разновидностями регулярных выражений, которые не поддерживают нежадный. Тем не менее, не жадный выглядит лучше.
  • 0
    @ Правильно, вы правы, сэр :)
Показать ещё 11 комментариев
75

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

\[([^]]+)\]
  • 4
    В моем случае использования текст в квадратных скобках может содержать новые строки, и это регулярное выражение работает, а принятый ответ - нет.
  • 1
    что означает класс символов [^]]? Что это соответствует?
Показать ещё 4 комментария
64
(?<=\[).+?(?=\])

Будет захватывать контент без скобок

  • (?<=\[) - позитивный взгляд за [

  • .*? - не жадный матч по содержанию

  • (?=\]) - позитивный взгляд на ]

РЕДАКТИРОВАТЬ: для вложенных скобок должно работать приведенное ниже регулярное выражение:

(\[(?:\[??[^\[]*?\]))
  • 3
    @igaurav Я проверил это, и это работает. Однако он не будет работать в средах, которые не поддерживают внешний вид, такой как Javascript. Может быть, это ваш случай?
  • 0
    Адам, твое решение для вложенных скобок завершается неудачно, когда есть строка с . в этом...
33

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

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

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

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

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

(?<=\().*?(?=\)) работает хорошо в соответствии с приведенным выше объяснением. Вот пример 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
    Вы должны всегда использовать форматирование кода для регулярных выражений, где бы они ни появлялись. Если регулярное выражение находится в тексте, а не в блоке кода, вы можете использовать обратные метки для их форматирования. ( ссылка )
  • 1
    Кроме того, вопрос касался квадратных скобок ( [] ), а не скобок.
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
3
([[][a-z \s]+[]])

Выше должно работать, учитывая следующее объяснение

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

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

  • + означает, что по крайней мере один из символов, упомянутых ранее, на +.

  • 0
    В чувствительных случаях AZ следует добавить в шаблон: ([[][a-zA-Z \s]+[]]) ; Я думаю, что это хороший способ, в то время как \ в шаблонах регулярных выражений, которые определяют строковые метки ("и") и смешивают новичков с помощью обратной косой черты в "или" использованиях!
  • 0
    единственный ответ, который работал для меня для регулярного выражения C ++ (за исключением того, что я делаю это с кавычками вместо скобок). std::regex pattern{R"(["][a-zA-Z \s]+["])"};
0

Помните, что немногие ответы содержат регулярные выражения, которые используют lookbehinds, которые не будут работать в браузерах, таких как Firefox. Всегда проверяйте свое регулярное выражение здесь: regexr.com перед его использованием

Ещё вопросы

Сообщество Overcoder
Наверх
Меню