Intereting Posts

Можете ли вы использовать обратные ссылки в части шаблона регулярного выражения?

Есть ли способ обратной ссылки в шаблоне регулярных выражений?

Пример строки ввода:

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