String.prototype.repeat()

Содержание:

Backreferences в паттерне и при замене

Иногда нужно в самом паттерне поиска обратиться к предыдущей его части.

Например, при поиске BB-тагов, то есть строк вида , и . Или при поиске атрибутов, которые могут быть в одинарных кавычках или двойных.

Обращение к предыдущей части паттерна в javascript осуществляется как \1, \2 и т.п., бэкслеш + номер скобочной группы:

Обращение к скобочной группе в строке замены идёт уже через доллар: . Не знаю, почему, наверное так удобнее…

P.S. Понятно, что при таком способе поиска bb-тагов придётся пропустить текст через замену несколько раз – пока результат не перестанет отличаться от оригинала.

1. Splitting and joining an array

If you google how to “replace all string occurrences in JavaScript”, most likely the first approach you’d find is to use an intermediate array.

Here’s how it works:

  1. Split the into by the string:
  1. Then join the pieces putting the string in between:

For example, let’s replace all spaces with hyphens in string:

splits the string into pieces: .

Then the pieces are joined by inserting in between them, which results in the string .

Here’s a generalized helper function that uses splitting and joining approach:

This approach requires transforming the string into an array, and then back into a string. Let’s continue looking for better alternatives.

Ví dụ

Định nghĩa một biểu thức regular expression trong phương thức replace()

Ví dụ bên dưới, regular expression được định nghĩa trong và nó có thêm flat «i» (giúp kết quả matching không phân biệt chữ hoa và chữ thường).

let str = 'Twas the night before Xmas...';
let newstr = str.replace(/xmas/i, 'Christmas');
console.log(newstr);  // Twas the night before Christmas...

This logs .

Note: See this guide for more explanations about regular expressions.

Sử dụng flag global và flag ignore trong replace()

Global replace (thay thế tất cả kết quả trùng khớp) có thể được thực hiện trong regex. Ví dụ sau, biểu thức regex có chứa các flag  cho phép sẽ thay thế mỗi string  trong chuỗi gốc với string . 

let re = /apples/gi;
let str = 'Apples are round, and apples are juicy.';
let newstr = str.replace(re, 'oranges');
console.log(newstr);  // oranges are round, and oranges are juicy.

This logs .

Đảo ngược vị trí của 2 từ trong một string

Đoạn code bên dưới sẽ đảo qua lại vị trí của các từ trong một string. Ở phần replacement, đoạn code sử dụng capturing groups và ký tự  để làm pattern cho phần replacement.

let re = /(\w+)\s(\w+)/;
let str = 'John Smith';
let newstr = str.replace(re, '$2, $1');
console.log(newstr);  // Smith, John

This logs .

Sử dụng một inline function để thay đổi các giá trị matched

Trong ví dụ này, tất cả trường hợp chữ cái viết hoa trong một string sẽ được convert sang dạng viết thường, và dấu gạch ngang sẽ được thêm vào trước vị trí matching đó. Điều quan trọng ở đây, là cần thêm vào các dấu gạch ngang này trước khi trả về một replacement hoàn chỉnh để sử dụng.

Replacement function này sẽ nhận vào các đoạn trích mà đã match với pattern làm tham số, và sử dụng các đoạn trích đó để biến đổi chữ hoa chữ thường, và ghép nối một dấu gạch ngang vào trước mỗi đoạn trích.

function styleHyphenFormat(propertyName) {
  function upperToHyphenLower(match, offset, string) {
    return (offset > 0 ? '-' : '') + match.toLowerCase();
  }
  return propertyName.replace(//g, upperToHyphenLower);
}

Given , this returns .

let newString = propertyName.replace(//g, '-' + '$&'.toLowerCase());  // won't work

This is because would first be evaluated as a string literal (resulting in the same ) before using the characters as a pattern.

Replacing a Fahrenheit degree with its Celsius equivalent

The following example replaces a Fahrenheit degree with its equivalent Celsius degree. The Fahrenheit degree should be a number ending with . The function returns the Celsius number ending with . For example, if the input number is , the function returns . If the number is , the function returns .

The regular expression checks for any number that ends with . The number of Fahrenheit degree is accessible to the function through its second parameter, . The function sets the Celsius number based on the Fahrenheit degree passed in a string to the function. then returns the Celsius number. This function approximates Perl’s flag.

function f2c(x) {
  function convert(str, p1, offset, s) {
    return ((p1 - 32) * 5/9) + 'C';
  }
  let s = String(x);
  let test = /(-?\d+(?:\.\d*)?)F\b/g;
  return s.replace(test, convert);
}

Примеры

Пример: использование регулярных выражений для смены формата данных

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

var re = /(\w+)\s(\w+)/; 
var str = 'John Smith';
var newstr = str.replace(re, '$2, $1');
console.log(newstr);

// пример с русскими буквами  
var re = /(+)\s(+)/i;  
var str = 'Джон Смит';  
var newstr = str.replace(re, '$2, $1');  
console.log(newstr);

Пример выведет «Smith, John» и «Смит, Джон»

Символы конца строки различаются на различных платформах (Unix, Windows и так далее). Разбиение строк из этого примера работает на всех платформах.

var text = 'Некоторый текст\nЕщё текст\r\nИ ещё\rЭто конец';
var lines = text.split(/\r\n|\r|\n/);
console.log(lines); // выведет 

Обратите внимание, что порядок шаблонов в регулярном выражении имеет значение

Пример: использование регулярных выражений на нескольких строках

var s = 'Please yes\nmake my day!';
s.match(/yes.*day/);
// Вернёт null
s.match(/yes*day/);
// Вернёт 'yes\nmake my day'

Пример: использование регулярных выражений с флагом «липучести»

Этот пример демонстрирует, как можно использовать флаг «липучести» регулярных выражений для сопоставления с отдельными строками многострочного ввода.

var text = 'Первая строка\nВторая строка';
var regex = /(\S+) строка\n?/y;

var match = regex.exec(text);
console.log(match);        // напечатает 'Первая'
console.log(regex.lastIndex); // напечатает '14'

var match2 = regex.exec(text);
console.log(match2);       // напечатает 'Вторая'
console.log(regex.lastIndex); // напечатает '27'

var match3 = regex.exec(text);
console.log(match3 === null); // напечатает 'true'

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

var supports_sticky;
try { RegExp('', 'y'); supports_sticky = true; }
catch(e) { supports_sticky = false; }
console.log(supports_sticky); // напечатает 'true'

Пример: регулярные выражения и символы Юникода

Как уже сказано выше, символьные классы и сопоставляются только с базовыми символами ASCII; то есть, с символами от «a» до «z», от «A» до «Z», от «0» до «9» и символом «_». Для сопоставления с символами из других языков, например, с кириллическими или иврита, используйте форму , где «hhhh» — это значение символа Юникода, записанное в шестнадцатеричной форме. Этот пример демонстрирует, как можно выделить символы Юникода, составляющие слова.

var text = 'Образец text на русском языке';
var regex = /+/g;

var match = regex.exec(text);
console.log(match);        // напечатает 'Образец'
console.log(regex.lastIndex); // напечатает '7'

var match2 = regex.exec(text);
console.log(match2);       // напечатает 'на' 
console.log(regex.lastIndex); // напечатает '15'

// и так далее

Вот на этом внешнем ресурсе можно составить полный диапазон блоков Юникода для различных письменностей: regexp-unicode-block.

Примеры

Пример: использование флагов и с методом

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

var re = /яблоки/gi;
var str = 'Яблоки круглые и яблоки сочные.';
var newstr = str.replace(re, 'апельсины');
console.log(newstr); // апельсины круглые и апельсины сочные.

Пример: передача регулярного выражения в метод

В следующем примере в метод передаётся регулярное выражение вместе с флагом игнорирования регистра.

// Ночь перед Рождеством, Xmas - сокращение для Christmas
var str = 'Twas the night before Xmas...';
var newstr = str.replace(/xmas/i, 'Christmas');
console.log(newstr); // Twas the night before Christmas...

Пример выведет строку ‘Twas the night before Christmas…’

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

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

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

Пример выведет строку ‘Смит, Джон’.

Пример: использование функции для изменения сопоставившихся символов

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

Здесь важно то, что прежде чем элемент вставится в качестве замены, над ним нужно провести дополнительные преобразования

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

function styleHyphenFormat(propertyName) {
  function upperToHyphenLower(match) {
    return '-' + match.toLowerCase();
  }
  return propertyName.replace(//g, upperToHyphenLower);
}

Вызов вернёт строку ‘border-top’.

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

var newString = propertyName.replace(//g, '-' + '$&'.toLowerCase());  // не работает

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

Пример: замена градусов по Фаренгейту на эквивалент в градусах по Цельсию

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

Регулярное выражение сопоставляется с любым числом, оканчивающимся на букву F. Количество градусов по Фаренгейту передаётся в функцию через её второй параметр, . Функция переводит градусы по Фаренгейту, переданные в виде строки в функцию code>f2c(), в градусы по Цельсию. Затем функция возвращает количество градусов по Цельсию. Эта функция работает примерно так же, как и флаг в Perl.

function f2c(x) {
  function convert(str, p1, offset, s) {
    return ((p1 - 32) * 5/9) + 'C';
  }
  var s = String(x);
  var test = /(\d+(?:\.\d*)?)F\b/g;
  return s.replace(test, convert);
}

Пример: использование функции вместе с регулярным выражением для избавления от цикла

Следующий пример принимает строку шаблона и преобразует её в массив объектов.

Входные данные:

Строка, состоящая из символов , и

x-x_
x---x---x---x---
x-xxx-xx-x-
x_x_x___x___x___

Выходные данные:

Массив объектов. Символ означает состояние , символ (дефис) означает состояние , а символ (нижнее подчёркивание) означает продолжительность состояния .

Код:

var str = 'x-x_';
var retArr = [];
str.replace(/(x_*)|(-)/g, function(match, p1, p2) {
  if (p1) { retArr.push({ on: true, length: p1.length }); }
  if (p2) { retArr.push({ on: false, length: 1 }); }
});

console.log(retArr);

Этот код сгенерирует массив из трёх объектов в описанном формате без использования цикла .

Синтаксис

const newStr = str.replaceAll(regexp|substr, newSubstr|function)

Параметри

(шаблон)
Об’єкт або літерал з глобальним прапором. Збіги замінюються на  або значення, яке повертає вказана функція . Регулярний вираз без глобального («g») прапора викине помилку : «replaceAll must be called with a global RegExp».
, який потрібно замінити на . Він вважається звичайним рядком та не інтерпретується як регулярний вираз.
(заміна)
, який замінює підрядок, вказаний параметром або . Підтримується ряд спеціальних шаблонів заміни; дивіться нижче розділ «».
(заміна)
Функція, що буде викликана для створення нового підрядка, який замінить збіги з наданим параметром  або . Аргументи, що передаються в цю функцію, описані нижче в розділі «».
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector