2016-10-12 51 views
6

Jak wykonać poprawne szukanie napisów i zamienić je w JavaScript bez żadnego udziału REGEX?Jak wykonać "ciągłe" wyszukiwanie ciągów i zastępować je w JavaScript, bez REGEX

Wiem, że doktorzy mówią, że jeśli pierwszym argumentem dla String.prototype.replace() jest ciąg, a nie wyrażenie regularne, to spowoduje literalną zamianę. Praktyka pokazuje, że nie jest do końca prawda:

"I am a string".replace('am', 'are') 
--> "I are a string" 

OK

"I am a string".replace('am', 'ar$e') 
--> "I ar$e a string" 

nadal OK

"I am a string".replace('am', 'ar$$e') 
--> "I ar$e a string" 

NIE OK!

Gdzie jest drugi znak dolara? Czy szuka czegoś takiego jak $1, aby zastąpić dopasowanie z REGEX ..., które nigdy nie było używane?

Jestem bardzo zagubiony i sfrustrowany, jakieś pomysły?

+0

Drugi znak dolara zostanie zjedzone powodu [to] (https: //developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace # Specifying_a_string_as_a_parameter). –

+0

Pozostaje pytanie, dlaczego te dziwactwa są nawet aktywne, ponieważ nie korzystam z regex? Wydaje mi się głupia. –

+0

@TonyBogdanov, ponieważ jest zdefiniowany w [15.5.4.11 String.prototype.replace (searchValue, replaceValue)] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.11). Jeśli chcesz wiedzieć, dlaczego api został zaprojektowany w ten sposób, musisz zapytać osoby, które zaangażowały się w tę decyzję. Ale nawet jeśli nie używasz wyrażenia regularnego, może to być przydatne np. wstaw trochę znaków do ciągu znaków na podstawie wartości wyszukiwania: '" test 1234 ".replace (" 12 "," $ &-"); " –

Odpowiedz

4

Jeśli używasz replace callback zamiast sznurka dosłowny, automatyczne zastępowanie regex nie zostaną wykonane:

"I am a string".replace('am',() => 'ar$$e') 
+0

Lub alternatywa:' "Niektóre ciąg TOKEN" .split ('TOKEN'). "ar $$ e") " –