en.javascript.info/10-regular-expressions-javascript/10-regexp-backreferences/article.md
2015-02-27 13:21:58 +03:00

3 KiB
Raw Blame History

Обратные ссылки \n и $n

На скобочные группы можно ссылаться как в самом паттерне, так и в строке замены. [cut]

Ссылки в строке замены мы уже видели: они имеют вид $n, где n -- это номер скобочной группы. Вместо $n подставляется содержимое соответствующей скобки:

//+ run
var name = "Александр Пушкин";

name = name.replace(/([а-яё]+) ([а-яё]+)/i, "$2, $1");
alert(name); // Пушкин, Александр

К скобочной группе можно также обратиться в самом шаблоне.

Рассмотрим это в реальном примере -- необходимо найти строку в кавычках. Эта строка может быть в одинарных кавычках '...' или в двойных "..." -- не важно, в каких именно, но открывающая и закрывающая кавычки должны быть одинаковыми.

Как такие строки искать? Регэксп ['"](.*?)['"] позволяет использовать разные кавычки, но он даст неверный ответ в случае, если одна кавычка ненароком оказалась внутри другой, как например в строке "She's the one":

//+ run
str = "He said:\"She's the one\"."

reg = /['"](.*?)['"]/g

alert( str.match(reg) ) // "She'

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

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

//+ run
str = "He said:\"She's the one\"."

reg = /(['"])(.*?)\1/g

alert( str.match(reg) ) // "She's the one"

Теперь работает верно!

Обратим внимание на два нюанса:

  • В строке замены ссылка на первую скобочную группу выглядит как `$1`, а в шаблоне нужно использовать `\1`.
  • Чтобы обращаться к скобочной группе -- не важно откуда, она не должна быть исключена из запоминаемых при помощи `?:`, то есть `(?:['"])` не подошло бы.