З рядковими літералами це досить просто.
Не зовсім! Приклад замінює лише перше виникнення string_to_replace. Частіше ви хочете замінити всі події, і в цьому випадку вам доведеться перетворити рядок у глобальний ( /.../g) RegExp. Ви можете зробити це з рядка за допомогою new RegExpконструктора:
new RegExp(string_to_replace, 'g')
Проблема в цьому полягає в тому, що будь-які спеціальні символи для регулярних виразів у рядковому літералі будуть вести себе спеціальними способами, а не нормальними символами. Щоб виправити це, вам доведеться відхилити їх від нахилу. На жаль, не існує вбудованої функції, яка б це зробила для вас, тому ось яку ви можете використовувати:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
Слід також зазначити , що при використанні RegExp в replace(), заміна рядки тепер має особливий характер теж $. Цього також потрібно уникнути, якщо ви хочете мати буква $у своєму тексті заміни!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Чотири $s, тому що це сама по собі заміна рядка - argh!)
Тепер ви можете реалізувати глобальну заміну рядків за допомогою RegExp:
function replace_foo(target, string_to_replace, replacement) {
var relit= escapeRegExp(string_to_replace);
var sub= escapeSubstitute(replacement);
var re= new RegExp(relit, 'g');
return target.replace(re, sub);
}
Який біль. На щастя, якщо все, що ви хочете зробити, це заміна прямого рядка без додаткових частин регулярного виразів, є швидший спосіб:
s.split(string_to_replace).join(replacement)
... і це все. Це загальнозрозуміла ідіома.
скажіть, я хочу замінити все, крім string_to_replace
Що це означає, що ви хочете замінити всі фрагменти тексту, не беручи участі у збігу з рядком? Заміна на це ^точно не ^означає , тому що означає маркер початку рядка, а не заперечення. ^є лише запереченням у []персонажних групах. Існують також негативні диски (?!...), але з цим у JScript є проблеми, так що зазвичай слід уникати цього.
Ви можете спробувати зіставити рядок "все до" і за допомогою функції відкинути будь-яку порожню ділянку між відповідними рядками:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Тут знову ж таки розкол може бути простішим:
var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
if (parts[i]!=='')
parts[i]= replacement;
return parts.join(string_to_match);
/розділові знаки регулярного вираження і при використанні цієї форми.