Не работает замена подстроки в строке JS

106
05 марта 2022, 12:30

Существует массив с именами allRoles, а также строковая переменная textSearchIn с текстом. Следующий код по идее должен находить в переменной textSearchIn имя из массива, если после него стоит точка, и заменять найденную подстроку в формате "*[имя из массива].", но замены не происходит. В чем может быть проблема?

let textSearchIn = "Городничий. Я пригласил вас, господа, с тем чтобы сообщить вам пренеприятное известие: к нам едет ревизор. Аммос Федорович. Как ревизор? Артемий Филиппович. Как ревизор? Городничий. Ревизор из Петербурга, инкогнито. И еще с секретным предписаньем. Аммос Федорович. Вот те на!"; 
 
let allRoles = ["Городничий", "Аммос Федорович", "Артемий Филиппович", "Лука Лукич", "Коробкин", "Жена Коробкина", "Люлюков", "Гостья"];     
 
let newText; 
 
for (let i = 0; i<allRoles.length; i++) { 
    token = allRoles[i]+"\."; 
    newText = textSearchIn.replace(new RegExp(token, 'g'), '*'+token); 
}

Answer 1

let textSearchIn = "Городничий. Я пригласил вас, господа, с тем чтобы сообщить вам пренеприятное известие: к нам едет ревизор. Аммос Федорович. Как ревизор? Артемий Филиппович. Как ревизор? Городничий. Ревизор из Петербурга, инкогнито. И еще с секретным предписаньем. Аммос Федорович. Вот те на!"; 
let allRoles = ["Городничий", "Аммос Федорович", "Артемий Филиппович", "Лука Лукич", "Коробкин", "Жена Коробкина", "Люлюков", "Гостья"]; 
 
const reg = new RegExp(`(` + allRoles.join(`\\.)|(`) + `\\.)`, 'gi') 
console.log(textSearchIn.replace(reg, (a) => '*' + a))

UPD Упрощенный вариант без группировки (...) от yar85

let textSearchIn = "Городничий. Я пригласил вас, господа, с тем чтобы сообщить вам пренеприятное известие: к нам едет ревизор. Аммос Федорович. Как ревизор? Артемий Филиппович. Как ревизор? Городничий. Ревизор из Петербурга, инкогнито. И еще с секретным предписаньем. Аммос Федорович. Вот те на!"; 
let allRoles = ["Городничий", "Аммос Федорович", "Артемий Филиппович", "Лука Лукич", "Коробкин", "Жена Коробкина", "Люлюков", "Гостья"]; 
 
const reg = new RegExp(allRoles.join(`\\.|`), 'gi') 
console.log(textSearchIn.replace(reg, '*$&'))

Answer 2

let textSearchIn = "Городничий. Я пригласил вас, господа, с тем чтобы сообщить вам пренеприятное известие: к нам едет ревизор. Аммос Федорович. Как ревизор? Артемий Филиппович. Как ревизор? Городничий. Ревизор из Петербурга, инкогнито. И еще с секретным предписаньем. Аммос Федорович. Вот те на!"; 
let allRoles = ["Городничий", "Аммос Федорович", "Артемий Филиппович", "Лука Лукич", "Коробкин", "Жена Коробкина", "Люлюков", "Гостья"];     
 
let newText = textSearchIn; 
for (let i = 0; i < allRoles.length; i++) { 
    let token = allRoles[i] + "\."; 
    newText = newText.replace(new RegExp(token, 'g'), '*' + token); 
} 
 
console.log(newText);

READ ALSO
Как создать несколько объектов через один конструктор? JavaScript

Как создать несколько объектов через один конструктор? JavaScript

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

84
Преобразование типизированного объекта в TypeScript

Преобразование типизированного объекта в TypeScript

Подскажите, пожалуйста, как в TypeScript obj преобразовать в newObj?

88
Как создать Map с двумя Map внутри?

Как создать Map с двумя Map внутри?

Вытаскиваю данные с биржи, сначала торговую пару, а потом к ней несколько данных по таймфреймамТо есть

100
Остановить таймер с помощью checknet js

Остановить таймер с помощью checknet js

У меня проблема Я создаю онлайн-тестЯ проверяю, что интернет был отключен с помощью плагина jquery checknet

101