Регулярка нахождения 2 одинаковых символов в строке

Рейтинг: 2Ответов: 1Опубликовано: 20.06.2023

Я пишу функцию, которая будет находить в строке символы, которые встречаются 2 и более раз, и если такие символы есть - заменяет каждый из них на ")", а если символ встретился в строке только один раз, то на "(". Уже придумал как сделать это другим путем, но хочу сделать регуляркой и str.replace - но не понимаю как. Если пишите свой вариант - разжуйте пожалуйста регулярку на самые мелкие части, потому что просто списать не хочется, хочется понять.

вот такие тесты

"din"      =>  "((("
"recede"   =>  "()()()"
"Success"  =>  ")())())"
"(( @"     =>  "))((" 

Ответы

▲ 2Принят

Для того, чтобы не составлять сложные выражения, воспользуйтесь заменой через функцию:

function ReplacingWithBrackets(text) {
  return text.toLowerCase().replace(/./g, (match, offset, string) => {
    return (string.split(match).length - 1 > 1) ? ')' : '(';
  });
};

console.log(ReplacingWithBrackets('din'));     //  (((
console.log(ReplacingWithBrackets('recede'));  //  ()()()
console.log(ReplacingWithBrackets('Success')); //  )())())
console.log(ReplacingWithBrackets('(( @'));    //  ))((

Логика работы такой замены проста:

  • Последовательно перебираем все символы (выражение /./g);
  • Передаём в функцию замены текущий найденный символ (match) и полную строку (string);
  • Разделяем string на части, используя в качестве разделителя match;
  • Если частей больше одной, то возвращаем нужную скобку для замены.