Регулярное выражение для извлечения текста в квадратных скобках - PullRequest
328 голосов
/ 08 марта 2010

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

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

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

sample
some
another one

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

Ответы [ 10 ]

626 голосов
/ 08 марта 2010

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

\[(.*?)\]

Пояснение:

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

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

\[([^]]+)\]
78 голосов
/ 01 декабря 2014
(?<=\[).+?(?=\])

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

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

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

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

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

(\[(?:\[??[^\[]*?\]))
32 голосов
/ 08 марта 2010

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

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

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

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

9 голосов
/ 24 апреля 2015

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

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

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

(?: 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 голосов
/ 23 мая 2011
([[][a-z \s]+[]])

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

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

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

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

2 голосов
/ 15 марта 2019

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

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"
1 голос
/ 21 мая 2019

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

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

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

Смотри в будущее положительно (? =)

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

A(?=B)

Смотри за позитивом (? <=) </h1> Найти выражение A, где выражение B предшествует: (?<=B)A

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

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

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

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

0 голосов
/ 15 марта 2019

Вот как это можно сделать с помощью 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...