Javascript глобальная замена строки

String.prototype.replace()

Метод replace() возвращает новую строку с одним, несколькими или всеми совпадениями pattern , замененными replacement . Шаблон может быть строкой или RegExp pattern а replacement может быть строкой или функцией, вызываемой для каждого совпадения. Если pattern является строкой, будет заменено только первое вхождение. Исходная строка остается неизменной. RegExp replacement pattern

Try it

Syntax

replace(pattern, replacement)

Parameters

Может быть строкой или объектом с методом Symbol.replace — типичным примером является регулярное выражение . Любое значение, не имеющее метода Symbol.replace , будет преобразовано в строку.

Может быть строкой или функцией.

  • Если это строка, она заменит подстроку, соответствующую pattern . Поддерживается ряд специальных шаблонов замены; см. раздел « Указание строки в качестве замены » ниже.
  • Если это функция, она будет вызываться при каждом совпадении, а ее возвращаемое значение используется в качестве замещающего текста. Аргументы, предоставляемые этой функции, описаны в разделе « Указание функции в качестве замены » ниже.

Return value

Новая строка,в которой одно,несколько или все совпадения шаблона заменены указанной заменой.

Description

Этот метод не изменяет строковое значение,вызванное им.Он возвращает новую строку.

Строковый шаблон будет заменен только один раз. Чтобы выполнить глобальный поиск и замену, используйте регулярное выражение с флагом g или вместо этого используйте replaceAll() .

Если pattern является объектом с методом Symbol.replace (включая объекты RegExp ), этот метод вызывается с целевой строкой и replacement в качестве аргументов. Его возвращаемое значение становится возвращаемым значением replace() . В этом случае поведение replace() полностью кодируется методом @@replace — например, любое упоминание «захвата групп» в описании ниже на самом деле является функциональностью, предоставляемой RegExp.prototype[@@replace] .

Читайте также:  Horseradish

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

Регулярное выражение с флагом g — единственный случай, когда replace() заменяет более одного раза. Для получения дополнительной информации о том, как свойства регулярных выражений (особенно липкий флаг) взаимодействуют с replace() , см. RegExp.prototype[@@replace]() .

Указание строки в качестве замены

Заменяющая строка может включать в себя следующие специальные заменяющие шаблоны:

Pattern Inserts
$$ Вставляет «$» .
$& Вставляет подходящую подложку.
$` Вставляет ту часть строки,которая предшествует подходящей подстроке.
$’ Вставляет ту часть строки,которая следует за соответствующей подстрокой.
$n Вставляет n -ю ( индексированную 1 ) группу захвата, где n — положительное целое число, меньшее 100.
$ Вставляет именованную группу захвата, где Name — это имя группы.

$n и $ доступны, только если аргумент pattern является объектом RegExp .Если pattern является строкой или соответствующая группа захвата отсутствует в регулярном выражении, шаблон будет заменен литералом. Если группа присутствует, но не соответствует (поскольку является частью дизъюнкции), она будет заменена пустой строкой.

"foo".replace(/(f)/, "$2"); //"$2oo";в regex отсутствует вторая группа "foo".replace("f", "$1"); //"$1oo";шаблон является строкой,поэтому у него нет групп "foo".replace(/(f)|(g)/, "$2"); //"oo";вторая группа существует,но с ней не сопоставлена 

Указание функции в качестве замены

В качестве второго параметра можно указать функцию.В этом случае функция будет вызвана после выполнения совпадения.Результат функции (возвращаемое значение)будет использован в качестве строки замены.

Примечание . Вышеупомянутые специальные шаблоны замены не применяются к строкам, возвращаемым функцией замены.

Функция имеет следующую сигнатуру:

function replacer(match, p1, p2, /* …, */ pN, offset, string, groups) < return replacement; >

Аргументы к функции следующие:

Соответствующая подстрока. (Соответствует $& выше.)

Строка n , найденная группой захвата (включая именованные группы захвата), при условии, что первым аргументом replace() является объект RegExp . (Соответствует $1 , $2 и т. д . выше.) Например, если pattern — /(\a+)(\b+)/ , то p1 соответствует \a+ , а p2 соответствует \b+ . Если группа является частью дизъюнкции (например, «abc».replace(/(a)|(b)/, replacer) ), несопоставленная альтернатива будет undefined .

Смещение совпадающей подстроки во всей проверяемой строке. Например, если вся строка была ‘abcd’ , а совпадающая подстрока была ‘bc’ , то этот аргумент будет равен 1 .

Объект, ключами которого являются используемые имена групп, а значениями — совпавшие части ( undefined , если не совпали). Присутствует только в том случае, если pattern содержит хотя бы одну именованную группу захвата.

Точное количество аргументов зависит от того, является ли первый аргумент объектом RegExp , и если да, то сколько у него групп захвата.

Следующий пример устанавливает newString к ‘abc — 12345 — #$*%’ :

function replacer(match, p1, p2, p3, offset, string) < // p1 не содержит цифр, p2 цифры и p3 не буквенно-цифровые символы return [p1, p2, p3].join(' - '); > const newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer); console.log(newString); // abc - 12345 - #$*% 

Функция будет вызываться несколько раз для каждого полного совпадения,подлежащего замене,если регулярное выражение в первом параметре является глобальным.

Examples

Определение регулярного выражения в replace()

В следующем примере регулярное выражение определяется в replace() и включает флаг игнорирования регистра.

const str = 'Twas the night before Xmas. '; const newstr = str.replace(/xmas/i, 'Christmas'); console.log(newstr); // Это была ночь перед Рождеством . 

Это журнал ‘Twas the night before Christmas. ‘ .

Примечание. Дополнительные сведения о регулярных выражениях см. в руководстве по регулярным выражениям.

Использование флагов global и ignoreCase в функции replace()

Глобальную замену можно выполнить только с помощью регулярного выражения. В следующем примере регулярное выражение включает глобальные флаги и флаги игнорирования регистра , что позволяет replace() заменять каждое вхождение слова ‘apples’ в строке на ‘oranges’ .

const re = /apples/gi; const str = 'Apples are round, and apples are juicy.'; const newstr = str.replace(re, 'oranges'); console.log(newstr); // апельсины круглые, а апельсины сочные. 

В этом бревне ‘oranges are round, and oranges are juicy’ .

Переключение слов в строке

Следующий скрипт переключает слова в строке. Для замещающего текста сценарий использует группы захвата и шаблоны замены $1 и $2 .

const re = /(\w+)\s(\w+)/; const str = 'John Smith'; const newstr = str.replace(re, '$2, $1'); console.log(newstr); // Смит, Джон 

Использование встроенной функции,которая модифицирует совпадающие символы.

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

Функция замены принимает в качестве параметра соответствующий фрагмент и использует его для преобразования регистра и конкатенирования дефиса перед возвращением.

function styleHyphenFormat(propertyName) < function upperToHyphenLower(match, offset, string) < return (offset > 0 ? '-' : '') + match.toLowerCase(); > return propertyName.replace(/[A-Z]/g, upperToHyphenLower); >

Учитывая styleHyphenFormat(‘borderTop’) , это возвращает ‘border-top’ .

Поскольку мы хотим дополнительно преобразовать результат сопоставления до того, как будет произведена окончательная подстановка, мы должны использовать функцию. Это заставляет оценку соответствия до метода toLowerCase() . Если бы мы попытались сделать это, используя сопоставление без функции, toLowerCase() не возымел бы никакого эффекта.

const newString = propertyName.replace(/[A-Z]/g, '-' + '$&'.toLowerCase()); // не сработает 

Это связано с тем, что ‘$&’.toLowerCase() сначала будет оцениваться как строковый литерал (в результате получится тот же ‘$&’ ) перед использованием символов в качестве шаблона.

Замена степени Фаренгейта на степень,эквивалентную по Цельсию.

В следующем примере градус Фаренгейта заменяется на эквивалентный градус Цельсия. Степень Фаренгейта должна быть числом, заканчивающимся на «F» . Функция возвращает число Цельсия, заканчивающееся на «C» . Например, если «212F» число «212F» , функция вернет «100C» . Если число равно «0F» , функция возвращает «-17.77777777777778C» .

Тест регулярного выражения test любое число, оканчивающееся на F . Число градусов по Фаренгейту доступно для функции через ее второй параметр, p1 . Функция устанавливает число Цельсия на основе количества градусов Фаренгейта, переданного в строке функции f2c() . f2c() возвращает число Цельсия. Эта функция аппроксимирует флаг Perl s///e .

function f2c(x) < function convert(str, p1, offset, s) < return `$<(p1 - 32) * 5 / 9>C`; > const s = String(x); const test = /(-?\d+(?:\.\d*)?)F\b/g; return s.replace(test, convert); >

Изготовление заменителя рода

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

console.log("abcd".replace(/(bc)/, (match, p1, offset) => `$ ($ ) `)); // "abc (1) d" 

Однако этот заменитель будет трудно обобщить, если мы хотим, чтобы он работал с любым шаблоном регулярных выражений. Заменитель является вариативным — количество аргументов, которые он получает, зависит от количества присутствующих групп захвата. Мы можем использовать остальные параметры , но это также будет собирать в массив offset , string и т.д. Тот факт, что groups могут передаваться или не передаваться в зависимости от идентичности регулярного выражения, также затруднит общее определение того, какой аргумент соответствует offset .

function addOffset(match, . args) < const offset = args.at(-2); return `$ ($ ) `; > console.log("abcd".replace(/(bc)/, addOffset)); // "abc (1) d" console.log("abcd".replace(/(?bc)/, addOffset)); // "abc (abcd) d" 

Приведенный выше пример addOffset не работает, когда регулярное выражение содержит именованную группу, потому что в этом случае args.at(-2) будет string , а не offset .

Вместо этого вам нужно извлечь последние несколько аргументов на основе типа, потому что groups — это объект, а string — это строка.

function addOffset(match, . args) < const hasNamedGroups = typeof args.at(-1) === "object"; const offset = hasNamedGroups ? args.at(-3) : args.at(-2); return `$ ($ ) `; > console.log("abcd".replace(/(bc)/, addOffset)); // "abc (1) d" console.log("abcd".replace(/(?bc)/, addOffset)); // "abc (1) d" 

Specifications

Источник

Оцените статью