W przypadku literałów tekstowych jest to dość łatwe.
Nie całkiem! Przykład zastępuje tylko pierwsze wystąpienie string_to_replace
. Częściej chcesz zamienić wszystkie wystąpienia, w takim przypadku musisz przekonwertować ciąg na global ( /.../g
) RegExp. Możesz to zrobić ze stringa używając new RegExp
konstruktora:
new RegExp(string_to_replace, 'g')
Problem z tym polega na tym, że wszelkie znaki specjalne wyrażenia regularnego w literale ciągu będą się zachowywać w swój specjalny sposób, zamiast być zwykłymi znakami. Aby to naprawić, musiałbyś uciec od odwrotnego ukośnika. Niestety, nie ma wbudowanej funkcji, która mogłaby to zrobić za Ciebie, więc oto jedna, której możesz użyć:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
Zauważ również, że kiedy używasz RegExp w replace()
, ciąg zastępujący ma teraz również znak specjalny $
. To również musi zostać zmienione, jeśli chcesz mieć literał $
w tekście zastępczym!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Cztery $
s, ponieważ sam w sobie jest ciągiem zastępczym - argh!)
Teraz możesz zaimplementować globalne zastępowanie ciągów za pomocą 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);
}
Co za ból. Na szczęście, jeśli wszystko, co chcesz zrobić, to zastąpienie prostego ciągu bez dodatkowych części wyrażenia regularnego, jest szybszy sposób:
s.split(string_to_replace).join(replacement)
...i to wszystko. To jest powszechnie rozumiany idiom.
powiedz, że chcę zastąpić wszystko oprócz string_to_replace
Co to znaczy, że chcesz zamienić wszystkie fragmenty tekstu, które nie biorą udziału w dopasowaniu do ciągu? Zamiana na z ^
pewnością tego nie robi, ponieważ ^
oznacza token początku łańcucha, a nie negację. ^
jest tylko negacją w []
grupach znaków. Istnieją również negatywne lookahead (?!...)
, ale są z tym problemy w JScript, więc generalnie należy tego unikać.
Możesz spróbować dopasować „wszystko do” do ciągu i użyć funkcji do odrzucenia pustego odcinka między pasującymi ciągami:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Tutaj znowu podział może być prostszy:
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);
/
separatory wyrażeń regularnych, używając również tego formularza.