March 6, 2009

Замена всех подстрок в JavaScript. Пишем метод replaceAll()

Существует ряд наиболее стандартных задач в программировании которые реализованы в ядре языка. Некоторые из них не реализованы напрямую. Например задача замены всех вхождений подстроки в строку в JavaScript. Первое что приходит в голову это вызвать метод replace у строки.
var myString="q w e r qq w e q";
myString = myString.replace('q', 'Q');

Но, существует НО. Этот метод заменит только первую найденную подстроку, а мы хотим заменить все. Метода replaceAll не существует. Вызывать метод replace в цикле пока не будут заменены все подстроки — не наш путь. Решение рядом.Для того чтобы сделать что нам необходимо нужно всего лишь вместо строки для замены подавать регулярное выражение с флагом 'g' - global match.
var myString="q w e r qq w e q";
myString = myString.replace(/q/g, 'Q');

Таким образом все вхожденя будут заменены. Вроде уже хорошо, но можно сделать еще проще. Давайте сделаем более OOP-style и добавим к классу String метод replaceAll.
String.prototype.replaceAll=function(find, replace_to){
    return this.replace(new RegExp(find, "g"), replace_to);
};

Таким образом вставив вначале вашего скрипта этот код, мы определим метод replaceAll у строки и потом можем просто вызывать с двумя параметрами - строки для поиска, и строки для замены.
"r re rer er er".replaceAll('r', '-');

Happy coding! :)

5 comments:

  1. Интересно, как будет работать вот такое:
    "a(b)c".replaceAll('(b)', '[d]');

    ReplyDelete
  2. "a([d])c"
    Хм, не то что ожидается...

    ReplyDelete
  3. А еще можно просто myString = myString.replace(/q/g, 'Q');

    заменит все q на Q

    ReplyDelete
  4. Что ж неплохое решение для нахождения подстрок) Спасибо Вам, позаимствовал с удовольствием.

    ReplyDelete