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

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

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

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

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

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

\[.*?\]

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

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

Ответ 1

Простой:

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

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

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

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

\[(.*?)\]

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

Ответ 2

Если вы используете 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"

Ответ 3

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

\[(.*?)\]

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

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

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

Ответ 4

PHP:

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

Ответ 5

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

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

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

Готово.

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

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

http://regexr.com/3gobr

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

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

Ответ 6

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

\[.+\]

Ответ 7

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

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

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

Ответ 8

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

 '\[(.*?)\]'  

тогда

'\b.*\b'

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

Ответ 9

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

  (?<=\/)([^#]+)(?=#*)

Ответ 10

Вот как я получил без '[' и ']' в С#:

        var text = "This is a test string [more or less]";
        //Getting only string between '[' and ']'
        Regex regex = new Regex(@"\[(.+?)\]");
        var matchGroups = regex.Matches(text);
        for (int i = 0; i < matchGroups.Count; i++)
        {
            Console.WriteLine(matchGroups[i].Groups[1]);
        }

Вывод:

more or less

Ответ 11

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

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

результат:

hola mundo