Friday, 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! :)

4 comments:

Raa said...

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

Prudnikov Vladimir said...

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

PAV said...

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

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

Englishman said...

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

Post a Comment