Регулярное выражение, чтобы найти строку, включенную между двумя символами при ИСКЛЮЧЕНИИ разделителей - PullRequest
249 голосов
/ 21 сентября 2009

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

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

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

Базовая строка : This is a test string [more or less]

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

\[.*?\]

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

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

Ответы [ 10 ]

368 голосов
/ 21 сентября 2009

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

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

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

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

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

\[(.*?)\]

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

47 голосов
/ 27 сентября 2015

Если вы используете 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"
17 голосов
/ 21 сентября 2009

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

\[(.*?)\]

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

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

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

8 голосов
/ 21 сентября 2009

PHP:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);
6 голосов
/ 13 сентября 2017

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

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

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

Готово.

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

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

http://regexr.com/3gobr

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

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

3 голосов
/ 05 марта 2017

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

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

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;
3 голосов
/ 23 октября 2014

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

\[.+\]
2 голосов
/ 04 апреля 2015

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

 '\[(.*?)\]'  

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

'\b.*\b'

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

0 голосов
/ 24 июля 2018

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

  (?<=\/)([^#]+)(?=#*)
0 голосов
/ 30 марта 2015

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

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

результат:

hola mundo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...