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


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

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

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

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

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

\[.*?\]

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

Возможно ли это сделать?

Author: Zanon, 2009-09-21

10 answers

Легко сделать:

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

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

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

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

\[(.*?)\]

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

 332
Author: cletus, 2009-09-21 14:55:45

Если вы используете JavaScript, первое решение , предоставленное клетусом, (?<=\[)(.*?)(?=\]), не будет работать, потому что 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"
 33
Author: Zanon, 2017-05-23 11:47:19

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

\[(.*?)\]

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

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

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

 16
Author: Xetius, 2009-09-21 23:20:15

PHP:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);
 8
Author: powtac, 2014-05-12 13:32:51

Для удаления также [] используйте:

\[.+\]
 3
Author: Cătălin Rădoi, 2014-10-23 09:30:32

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

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

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

Готово.

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

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

Http://regexr.com/3gobr

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

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

 3
Author: Stieneee, 2017-09-13 19:55:03

У меня была та же проблема с использованием регулярных выражений в сценариях bash. Я использовал 2-шаговое решение с использованием труб с применением grep-o

 '\[(.*?)\]'  

Сначала, затем

'\b.*\b'

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

 2
Author: A. Jesús, 2015-04-04 10:20:44

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

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

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;
 2
Author: null, 2017-03-05 19:39:29

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

  (?<=\/)([^#]+)(?=#*)
 0
Author: techguy2000, 2018-07-23 21:51:01

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

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

Результат:

hola mundo

 -1
Author: Nico, 2015-03-30 15:35:33