Обратные ссылки в JScript
Обратные ссылки служат для поиска повторяющихся групп символов. Они также используются для переформатирования строки ввода путем изменения порядка и размещения элементов строки ввода.
К части выражения можно обратиться из регулярного выражения и из строки замены. Каждая часть выражения идентифицируется номером и считается обратной ссылкой.
Круглые скобки в регулярном выражении используются для создания частей выражения. Результирующая подстрока совпадения может быть извлечена программой. Дополнительные сведения см. в разделе Чередование и части выражений.
Использование обратных ссылок
К части выражения можно обратиться из регулярного выражения.
В регулярном выражении каждая определенная подстрока сохраняется слева направо в том виде, в котором она была найдена. Номера буферов, в которых сохраняются найденные подстроки, начинаются с единицы и продолжаются до 99. Доступ к каждому буферу из регулярного выражения осуществляется с помощью \n, где n — это одна или две десятичные цифры, задающие номер соответствующего буфера.
Одно из применений обратных ссылок заключается в возможности обнаружения в тексте двух расположенных рядом одинаковых слов. Прочитайте следующее предложение:Is is the cost of of gasoline going up up?
Это предложение содержит несколько повторяющихся слов. Было бы удобно найти способ исправления этого предложения без поиска повторений для каждого отдельного слова. В следующем регулярном выражении JScript для этого используется отдельная часть выражения.
/\b([a-z]+) \1\b/gi
В данном контексте частью выражения называется любая последовательность знаков, заключенная в круглые скобки. Часть выражения соответствует одной или нескольким латинским буквам, на что указывает [a-z]+. Вторая часть регулярного выражения является ссылкой на ранее сохраненное частичное совпадение, то есть второе вхождение слова, соответствующее выражению в скобках. Ссылка \1 используется для указания на первую подстроку найденного соответствия.
Метасимволы границы слова \b позволяют искать только отдельные слова. В противном случае данное выражение неверно определит такие фразы как "is issued" или "this is".
Следующий пример выводит список дублирующихся слов. В нем показано, как в коде ссылаться на соответствия и подстроки соответствия.
var result;
var re = /\b([a-z]+) \1\b/gi
var src = "Is is the cost of of gasoline going up up?"
// Get the first match.
result = re.exec(src);
while (result != null)
{
// Show the entire match.
print();
print(result[0]);
// Show the submatches.
for (var index = 1; index < result.length; index++)
{
print("submatch " + index + ": " + result[index]);
}
// Get the next match.
result = re.exec(src);
}
// Output:
// Is is
// submatch 1: Is
// of of
// submatch 1: of
// up up
// submatch 1: up
К части выражения можно обратиться из строки замены.
С помощью приведенного выше регулярного выражения код следующего примера может заменить вхождения двух последовательных одинаковых слов в текстовой строке на одно вхождение этого слова. В методе replace $1 указывает на первую сохраненную подстроку соответствия. При наличии нескольких подстрок соответствия необходимо обращаться к ним последовательно: $2, $3 и т. д.
var re = /\b([a-z]+) \1\b/gi
var src = "Is is the cost of of gasoline going up up?"
var result = src.replace(re, "$1");
print(result);
// Output:
// Is the cost of gasoline going up?
В следующем примере меняются местами все пары слов в строке.
var re = /(\S+)(\s+)(\S+)/gi
var src = "The quick brown fox jumps over the lazy dog."
var result = src.replace(re, "$3$2$1");
print(result);
// Output:
// quick The fox brown over jumps lazy the dog.