Powiedzmy, że chcę, aby następujące elementy były ponownie używane:
function replace_foo(target, replacement) {
return target.replace("string_to_replace",replacement);
}
Mógłbym zrobić coś takiego:
function replace_foo(target, string_to_replace, replacement) {
return target.replace(string_to_replace,replacement);
}
W przypadku literałów tekstowych jest to dość łatwe. Ale co, jeśli chcę trochę skomplikować z wyrażeniem regularnym? Na przykład powiedz, że chcę zastąpić wszystko, ale string_to_replace
. Instynktownie spróbuję rozszerzyć powyższe, robiąc coś takiego:
function replace_foo(target, string_to_replace, replacement) {
return target.replace(/^string_to_replace/,replacement);
}
To nie działa. Domyślam się, że uważa, że string_to_replace
jest to literał łańcuchowy, a nie zmienna reprezentująca ciąg. Czy możliwe jest tworzenie wyrażeń regularnych JavaScript w locie za pomocą zmiennych łańcuchowych? Coś takiego byłoby świetne, gdyby w ogóle możliwe:
function replace_foo(target, string_to_replace, replacement) {
var regex = "/^" + string_to_replace + "/";
return target.replace(regex,replacement);
}
javascript
regex
buley
źródło
źródło
/
separatory wyrażeń regularnych, używając również tego formularza.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ącnew RegExp
konstruktora: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ć:
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!(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:
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:
...i to wszystko. To jest powszechnie rozumiany idiom.
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:
Tutaj znowu podział może być prostszy:
źródło
Jak powiedzieli inni, użyj
new RegExp(pattern, flags)
do tego. Warto zauważyć, że do tego konstruktora będziesz przekazywał literały łańcuchowe, więc każdy lewy ukośnik będzie musiał zostać zmieniony. Jeśli na przykład chciałbyś, aby twoje wyrażenie regularne pasowało do ukośnika odwrotnego, musiałbyś powiedziećnew RegExp('\\\\')
, podczas gdy literał wyrażenia regularnego musiałby tylko być/\\/
. W zależności od tego, jak zamierzasz tego użyć, powinieneś uważać na przekazywanie danych wejściowych użytkownika do takiej funkcji bez odpowiedniego przetwarzania wstępnego (unikanie znaków specjalnych itp.). Bez tego użytkownicy mogą uzyskać bardzo nieoczekiwane wyniki.źródło
/\b[term]\B/
, ale podczas konstruowania go muszę wywołaćnew RegExp("\\b"+ term + "\\B")
. Mały, ale ważna różnica, i trudne do wykrycia, ponieważ używając go jako regex bezpośrednio wykonuje prace zgodnie z oczekiwaniami.Tak, możesz.
https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions
źródło
Myślę, że mam bardzo dobry przykład podświetlenia tekstu w ciągu (znajduje nie patrząc na rejestr, ale podświetlony za pomocą rejestru)
http://jsfiddle.net/cdbzL/1258/
źródło
Naprawdę prostym rozwiązaniem jest to:
W ogóle nie ma potrzeby stosowania Regexów
Wydaje się również, że jest najszybszy w nowoczesnych przeglądarkach https://jsperf.com/replace-vs-split-join-vs-replaceall
źródło