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

412

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

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

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

sample
some
another one

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

Оби-Ван Кеноби
источник

Ответы:

767

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

\[(.*?)\]

Объяснение:

  • \[: [является метасимволом и должен быть экранирован, если вы хотите, чтобы он соответствовал буквально.
  • (.*?) : сопоставьте все не жадным способом и запишите это.
  • \]: ]является метасимволом и должен быть экранирован, если вы хотите, чтобы он соответствовал буквально.
codaddict
источник
9
Другой метод ответа - использование [^]]быстрее, чем non-greedy ( ?), а также работает с разновидностями regex, которые не поддерживают non-greedy. Тем не менее, не жадный выглядит лучше.
Ipsquiggle
184
Как исключить [ ]из вывода (результат)?
Микки Тин,
9
@MickeyTin, если вы используете Java, вы можете сгруппировать его, используя group (1), а не просто group (), поэтому «[]» не
сойдутся
21
Это соответствует только первому вхождению
hfatahi
9
Как вы исключаете скобки из возврата?
jzadra
119
(?<=\[).+?(?=\])

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

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

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

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

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

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

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

\[([^]]+)\]
jasonbar
источник
5
В моем случае использования текст в квадратных скобках может содержать новые строки, и это регулярное выражение работает, а принятый ответ - нет.
Дэйв
1
что означает класс символов [^]]? Что это соответствует?
Ричард
3
@Richard, ^ отрицает класс персонажа. Это означает «любой символ, который не является]».
Джейсонбар
8
Я думаю, что это не работает, как ожидалось, вы должны использовать, \[([^\[\]]*)\]чтобы получить содержимое в самой внутренней скобке. Если вы посмотрите, lfjlksd [ded[ee]22]то \[([^]]+)\]получите, [ded[ee]пока предложенное выражение вернется [ee]. тестирование в ссылке
TMC
1
Можете ли вы предоставить примеры 'sed' и 'awk' для использования этого регулярного выражения и извлечения текста. Спасибо.
Валентин
32

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

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

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

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

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

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

Давайте разберемся с этим

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

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

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

A(?=B)

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

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

(?<=B)A

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

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

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

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

ЖЖ Жермен
источник
12

(?<=\[).*?(?=\])хорошо работает в соответствии с объяснением, приведенным выше. Вот пример 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'"
DEVD
источник
1
Вы должны всегда использовать форматирование кода для регулярных выражений, где бы они ни появлялись. Если регулярное выражение находится в тексте, а не в блоке кода, вы можете использовать обратные метки для их форматирования. ( ссылка )
Алан Мур
1
Кроме того, вопрос касался квадратных скобок ( []), а не скобок.
Алан Мур
6

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

\[(([^\]\[]+)|(?R))*+\]

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

RegEx Demo 1


Кроме этого,

\[([^\]\[\r\n]*)\]

RegEx Demo 2

или,

(?<=\[)[^\]\[\r\n]*(?=\])

RegEx Demo 3

хорошие варианты для изучения.


Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . Если вы хотите, вы также можете посмотреть в этой ссылке , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

jex.im визуализирует регулярные выражения:

введите описание изображения здесь

Тестовое задание

const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Источник

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

Эмма
источник
4

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

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

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

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

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

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

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

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

(\[.*\])
ßãlãjî
источник
3
([[][a-z \s]+[]])

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

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

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

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

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

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

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"
Тони Ладсон
источник
... или gsub(pat, "\\1", x, perl=TRUE)где patрегулярное выражение, которое вы предоставили ..
Карстен В.
1

Чтобы сопоставить подстроку между первым [ и последним ] , вы можете использовать

\[.*\]            # Including open/close brackets
\[(.*)\]          # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\])   # Excluding open/close brackets (using lookarounds)

Посмотрите демонстрацию регулярных выражений и демонстрацию регулярных выражений # 2 .

Используйте следующие выражения для сопоставления строк в ближайших квадратных скобках :

  • Включая скобки:

    • \[[^][]*]- PCRE, Python re/ regex, .NET, Golang, POSIX (grep, sed, bash)
    • \[[^\][]*]- ECMAScript (JavaScript, C ++ std::regex, VBA RegExp)
    • \[[^\]\[]*] - Java регулярное выражение
    • \[[^\]\[]*\] - Onigmo (Ruby, требует экранирования скобок везде)
  • Исключая скобки:

    • (?<=\[)[^][]*(?=])- PCRE, Python re/ regex, .NET (C # и т. Д.), ICU (R stringr), JGSoft Software
    • \[([^][]*)]- Bash , Golang - захватить содержимое между квадратными скобками с парой неэкранированных скобок, также смотрите ниже
    • \[([^\][]*)]- JavaScript , C ++std::regex , VBARegExp
    • (?<=\[)[^\]\[]*(?=]) - Java регулярное выражение
    • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, требует экранирования скобок везде)

ПРИМЕЧАНИЕ : *соответствует 0 или более символам, используйте +для соответствия 1 или более, чтобы избежать совпадений с пустой строкой в ​​результирующем списке / массиве.

Всякий раз, когда доступны обе альтернативные поддержки, вышеупомянутые решения полагаются на них, чтобы исключить начальную / конечную скобку открытия / закрытия. В противном случае полагайтесь на группы захвата (предоставлены ссылки на наиболее распространенные решения на некоторых языках).

Если вам нужно сопоставить вложенные скобки , вы можете увидеть решения в регулярном выражении для соответствия потоку сбалансированных скобок и заменить круглые скобки квадратными, чтобы получить необходимую функциональность. Вы должны использовать группы захвата для доступа к содержимому, за исключением скобок открытия / закрытия:

Виктор Стрибьев
источник
0

Мне нужно было включить новые строки и в том числе скобки

\[[\s\S]+\]

citynorman
источник