Мне нужно извлечь из строки набор символов, которые включены между двумя разделителями, не возвращая сами разделители.
Простой пример должен быть полезным:
Цель : извлечь подстроку между квадратными скобками, не возвращая сами скобки.
Базовая строка : это тестовая строка [более или менее]
Если я использую следующую рег. ех.
\ [. *? \]
Матч [более или менее] . Мне нужно получить только больше или меньше (без скобок).
Можно ли это сделать?
Легко сделано:
(?<=\[)(.*?)(?=\])
Технически это использует lookaheads и lookbehinds. См. « Утверждения нулевой ширины» Lookahead и Lookbehind . Шаблон состоит из:
В качестве альтернативы вы можете просто захватить то, что находится между квадратными скобками:
\[(.*?)\]
и вернуть первую захваченную группу вместо всего матча.
Если вы используете 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 или более ничего, что не [
. Создает группы этих совпадений.
(?=\])
Положительный взгляд. Соответствует группе, заканчивающейся ]
не включая ее в результат.
Готово.
[^\[]+(?=\])
Доказательство.
Подобно решению, предложенному null. Но дополнительный \]
не требуется. В качестве дополнительной заметки, как представляется, не требуется, чтобы избежать [
после ^
. Для удобства чтения я оставил бы его.
Не работает в ситуации, когда разделители идентичны. "more or less"
например.
Если вам нужно извлечь текст без скобок, вы можете использовать bash awk
echo " [hola mundo] " | awk -F'[][]' '{print $2}'
результат:
hola mundo