Есть ли способ обратной ссылки в шаблоне регулярных выражений?
Пример строки ввода:
Here is "some quoted" text.
Скажем, я хочу вытащить цитируемый текст, я мог бы создать следующее выражение:
"([^"]+)"
Это регулярное выражение будет соответствовать some quoted
.
Скажем, я хочу, чтобы он также поддерживал одиночные кавычки, я мог бы изменить выражение на:
["']([^"']+)["']
Но что, если входная строка содержит смесь кавычек, скажем, Here is 'some quoted" text.
Я бы не хотел, чтобы регулярное выражение соответствовало. В настоящее время регулярное выражение во втором примере все равно будет соответствовать.
То, что я хотел бы сделать, – это если первая цитата – двойная кавычка, тогда закрывающая цитата должна быть двойной. И если стартовая кавычка – одинарная кавычка, то закрывающая цитата должна быть одиночной.
Могу ли я использовать обратную ссылку для этого?
Мой другой вопрос: получение текста между кавычками с использованием регулярного выражения
Вы можете использовать регулярное выражение:
(["'])[^"']+\1
()
: используется для группировки [..]
: это класс char. поэтому ["']
соответствует либо "
или '
эквивалентно "|'
[^..]
: класс char с отрицанием. Он соответствует любому знаку, не указанному после ^
+
: квантификатор для одного или нескольких \1
: обратная регистрация первой группы, которая является (["'])
В PHP
вы должны использовать это как:
preg_match('#(["\'])[^"\']+\1#',$str)
Рабочий пример
preg_match('/(["\'])([^"\']+)\1/', 'Here is \'quoted text" some quoted text.');
Объяснение: (["'])([^"']+)\1/
I поместил первую цитату в круглые скобки. Поскольку это первая группировка, это обратный ссылочный номер равен 1. Затем, где будет закрывающая цитата, я поместил \ 1, что означает, что какой-либо символ был сопоставлен в группе 1.
/"\(.*?\)".*?\1/
должен работать, но это зависит от механизма регулярных выражений