Регулярное выражение, чтобы найти строку, содержащуюся между двумя символами, ИСКЛЮЧАЯ разделители

Мне нужно извлечь из строки набор символов, которые включены между двумя разделителями, не возвращая сами разделители.

Простой пример должен быть полезным:

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

Базовая строка : это тестовая строка [более или менее]

Если я использую следующую рег. ех.

  \ [. *? \] 

Матч [более или менее] . Мне нужно получить только больше или меньше (без скобок).

Можно ли это сделать?

Легко сделано:

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

Технически это использует lookaheads и lookbehinds. См. « Утверждения нулевой ширины» Lookahead и Lookbehind . Шаблон состоит из:

  • предшествует [который не захвачен (lookbehind);
  • не жадная захваченная группа. Нежелательно останавливаться на первом]; а также
  • за которым следует a], который не фиксируется (lookahead).

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

 \[(.*?)\] 

и вернуть первую захваченную группу вместо всего матча.

Если вы используете JavaScript , первое решение, предоставляемое cletus, (?<=\[)(.*?)(?=\]) , Не будет работать, потому что JavaScript не поддерживает оператор lookbehind.

Однако второе решение работает хорошо, но вам нужно получить второй согласованный элемент.

Пример:

 var regex = /\[(.*?)\]/; var strToMatch = "This is a test string [more or less]"; var matched = regex.exec(strToMatch); 

Он вернется:

 ["[more or less]", "more or less"] 

Итак, вам нужно второе значение. Использование:

 var matched = regex.exec(strToMatch)[1]; 

Вернуться:

 "more or less" 

Вам просто нужно «захватить» бит между скобками.

 \[(.*?)\] 

Чтобы захватить вас, поместите его в круглые скобки. Вы не говорите, какой язык он использует. Например, в Perl вы получите доступ к этому, используя переменную $ 1.

 my $string ='This is the match [more or less]'; $string =~ /\[(.*?)\]/; print "match:$1\n"; 

Другие языки будут иметь разные механизмы. C #, например, использует класс коллекции Match , я считаю.

PHP:

 $string ='This is the match [more or less]'; preg_match('#\[(.*)\]#', $string, $match); var_dump($match[1]); 

У меня была такая же проблема с использованием regex с bash-скриптами. Я использовал двухэтапное решение, используя трубы с применением grep -o

  '\[(.*?)\]' 

будет первый

 '\b.*\b' 

Очевидно, что это не так эффективно при других ответах, но альтернатива.

Чтобы удалить также [], используйте:

 \[.+\] 

Это специально работает для парсера регулярного выражения javascript /[^[\]]+(?=])/g

просто запустите это в консоли

 var regex = /[^[\]]+(?=])/g; var str = "This is a test string [more or less]"; var match = regex.exec(str); match; 

[^\[] Сопоставьте любой символ, который не является [.

+ Сопоставьте 1 или более ничего, что не [ . Создает группы этих совпадений.

(?=\]) Положительный взгляд. Соответствует группе, заканчивающейся ] не включая ее в результат.

Готово.

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

Доказательство.

http://regexr.com/3gobr

Подобно решению, предложенному null. Но дополнительный \] не требуется. В качестве дополнительной заметки, как представляется, не требуется, чтобы избежать [ после ^ . Для удобства чтения я оставил бы его.

Не работает в ситуации, когда разделители идентичны. "more or less" например.

Если вам нужно извлечь текст без скобок, вы можете использовать bash awk

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

результат:

hola mundo