Есть ли способ обратной ссылки в шаблоне регулярных выражений?
Пример строки ввода:
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/ должен работать, но это зависит от механизма регулярных выражений