Как создать сайт

Обратные ссылки: \n и $n в регулярных выражениях

Здравствуйте! В прошлом уроке мы с вами рассмотрели скобочные группы в регулярных выражениях. Так вот скобочные группы можно не только получать в итоговом результате.

Все дело в том, что движок регулярных выражений может запоминать содержимое этих скобочных групп, и впоследствии их можно использовать как в самом шаблон, так и в строке замены.

Обратные ссылки в регулярных выражениях

 

 

 

Группа в строке замены

Ссылки в строке замены пишутся как  $n, где n – это номер скобочной группы.

Вместо $n будет подставлено  содержимое соответствующей скобки:

var name = "Лев Толстой"; name = name.replace(/([а-яё]+) ([а-яё]+)/i, "$2, $1"); alert( name ); // Толстой, Александр

Как видите в  примере вместо $2  будет подставлено  второе найденное слово, а вместо $1 –  соотвественно первое.

Группа в шаблоне

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

Но  все дело в том, что к скобочной группе вы можете  также обратиться  собственно  и в самом поисковом шаблоне, ссылкой вида \1, где цифра номер скобочной группы.

Давайте для большей ясности рассмотрим на кокретном примере – пусть необходимо найти в тексте строку в кавычках. Причём кавычки могут быть как одинарными ‘…’ так и  двойными «…» .

Как  искать такие строки ?

Можно в регулярке предусмотреть какие-нибудь произвольные кавычки: [‘»](.*?)[‘»]. Такой шаблон найдёт строки вида «…», ‘…’, но он даст неправильный ответ в том случае, если  кавычка  встретиться внутри строки. «He’s the  another one!»:

var str1 = "He said: \"He's the another  one!\".";
var reg1 = /['"](.*?)['"]/g;
// Результат не соответствует замыслу
alert( str1.match(reg1) ); // "He'

Как видите, шаблон нашёл открывающую кавычку «, а затем  весь текст, вплоть до новой кавычки ‘, которая  и закрывает соответствие.

Читайте также  Скобочные группы в регулярных выражениях

Для того, чтобы попросить регэксп искать закрывающую кавычку – такую же, как открывающую, мы обернём её в скобочную группу и используем обратную ссылку на неё:

var str1 = "He said: \"He's the another one!\".";
var reg1 = /(['"])(.*?)\1/g;
alert( str1.match(reg1) ); // "He's the another one!"

Теперь  все работает верно! Шаблон регулярных выражений,  когда найдет  первое скобочное выражение – кавычку ([‘»]),  будет запоминать  его и далее \1 означает «найти то же самое, что в первой скобочной группе». Но тут есть пара нюансов:

  • Для того чтобы использовать скобочную группу в строке  – нужно использовать ссылку вида $n, а в от  шаблоне – обратный слэш: \n.
  • Для того чтобы  иметь возможность обратиться к данной  скобочной группе – не важно откуда, она не должна быть удалена из запоминаемых при помощи символа  ?:. Скобочные группы (?:…) не  будут учавствовать в нумерации.

ИТОГИ

В скобочных группах могут быть использованы обратные ссылки.

Ссылки вида $n используются в строке замены, то есть вне шаблона регулярных выражений.

Ссылки вида /n используются в самом шаблоне регулярных выражений для того чтобы повторять  скобочную группу.

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

Задачи

Найдите пары ББ-тегов

ББ-тег имеет вид [имя]…[/имя], где имя – слово, одно из: b, url, quote. Например:

[b]текст[/b]
[url]http://google.ru[/url]

Создайте регулярное выражение для поиска ББ-тегов и их содержимого.

Например:

var re1 = /* регулярка */
var str = "..[url]http://google.ru[/url]..";
alert( str.match(re) ); // [url]http://google.ru[/url]

Если теги вложены, то нужно искать самый внешний тег (при желании можно будет продолжить поиск в его содержимом):

var re1 = /* регулярка */
var str1 = "..[url][b]http://google.ru[/b][/url]..";
alert( str1.match(re1) ); // [url][b]http://google.ru[/b][/url]
Плюсануть
Поделиться
Понравилась запись? Подпишитесь на обновления по почте:

Об авторе

admin administrator

Оставить ответ

36 − 34 =

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: