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

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

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

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

sample
some
another one

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

Ответ 1

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

\[(.*?)\]

Пояснение:

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

\[([^]]+)\]

Ответ 4

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

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

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

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

Ответ 5

(?<=\().*?(?=\)) работает хорошо в соответствии с приведенным выше объяснением. Вот пример 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'"

Ответ 6

Если вы не хотите включать скобки в совпадение, используйте регулярное выражение: (?<=\[).*?(?=\])

Пусть разбить это

. соответствует любому символу, кроме символов конца строки. ?= Является положительным взглядом. Положительный взгляд находит строку, когда за ней следует определенная строка. ?<= Это позитивный взгляд сзади. Положительный взгляд сзади находит строку, когда ей предшествует определенная строка. Процитирую это,

Смотри вперед позитивно (? =)

Найдите выражение A, за которым следует выражение B:

A(?=B)

Смотреть за положительным (? <=)

Найдите выражение A, где предшествует выражение B:

(?<=B)A

Альтернатива

Если ваш движок регулярных выражений не поддерживает предпросмотры и предпросмотры, то вы можете использовать регулярное выражение \[(.*?)\] Для захвата внутренних скобок в группе, а затем при необходимости управлять группой.

Как работает это регулярное выражение?

Скобки фиксируют символы в группе. .*? получает все символы в скобках (кроме разделителей строк, если у вас не включен флаг s) способом, который не является жадным.

Ответ 7

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

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

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

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

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

Ответ 8

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

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

(?: 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

Ответ 9

В R попробуйте:

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"

Ответ 10

если вы хотите заполнить только маленькую букву алфавита между квадратными скобками a-z

(\[[a-z]*\])

если вы хотите маленькие буквы и заглавные буквы a-zA-Z

(\[[a-zA-Z]*\]) 

если вы хотите маленькие буквы и цифры a-zA-Z0-9

(\[[a-zA-Z0-9]*\]) 

если вы хотите все между квадратной скобкой

если вы хотите текст, число и символы

(\[.*\])

Ответ 11

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

Ответ 12

Вот как это можно сделать с помощью JS:

"this is a [sample] string with [some] special words. [another one]".replace(/\[(.*?)\]/gi, "$1")

Это производит следующую строку:

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