Próbuję zastąpić wiele słów w ciągu wieloma innymi słowami. Sznurek brzmi: „Mam kota, psa i kozę”.
Nie powoduje to jednak: „Mam psa, kozę i kota”, ale zamiast tego daje „Mam kota, kota i kota”. Czy w JavaScript można zastąpić wiele ciągów jednocześnie wieloma innymi ciągami, aby uzyskać poprawny wynik?
var str = "I have a cat, a dog, and a goat.";
str = str.replace(/cat/gi, "dog");
str = str.replace(/dog/gi, "goat");
str = str.replace(/goat/gi, "cat");
//this produces "I have a cat, a cat, and a cat"
//but I wanted to produce the string "I have a dog, a goat, and a cat".
Odpowiedzi:
Konkretne rozwiązanie
Możesz użyć funkcji, aby zastąpić każdą z nich.
przykład jsfiddle
Uogólniając to
Jeśli chcesz dynamicznie utrzymywać wyrażenie regularne i po prostu dodawać przyszłe wymiany do mapy, możesz to zrobić
wygenerować wyrażenie regularne. Więc to wyglądałoby tak
Aby dodać lub zmienić więcej zamienników, wystarczy edytować mapę.
skrzypce z dynamicznym wyrażeniem regularnym
Dzięki temu jest wielokrotnego użytku
Jeśli chcesz, aby był to ogólny wzorzec, możesz wyciągnąć to do takiej funkcji
Więc możesz po prostu przekazać str i mapę zamienników, które chcesz do funkcji, i zwróci transformowany ciąg.
skrzypce z funkcją
Aby upewnić się, że Object.keys działa w starszych przeglądarkach, dodaj polifill np. Z MDN lub Es5 .
źródło
.
notacji ze wszystkimi takimi właściwościami. Notacja w nawiasach działa na dowolnym łańcuchu.map={'.': ',', ',': '.'}
i regex/\.|,/g
.return mapObj[matched.toLowerCase()];
tylkoreturn mapObj[matched];
ponieważ używam klawiszy czułych Sprawa wmapObj
.Object.keys(mapObj).map(key => key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')
. Zainspirowany tą odpowiedziąW tym przypadku może to nie zaspokajać dokładnie Twojej potrzeby, ale znalazłem przydatny sposób na zastąpienie wielu parametrów w ciągach, jako ogólne rozwiązanie. Zastąpi wszystkie wystąpienia parametrów, bez względu na to, ile razy są do nich odniesienia:
Wywołalibyście to w następujący sposób:
źródło
Użyj ponumerowanych elementów, aby zapobiec wymianie. na przykład
następnie
Jak to działa: -% \ d + znajduje liczby, które występują po%. Nawiasy przechwytują liczbę.
Ta liczba (jako ciąg znaków) jest drugim parametrem, n, funkcji lambda.
+ N-1 konwertuje ciąg na liczbę, a następnie 1 jest odejmowany w celu zindeksowania tablicy zwierzaków.
Liczba% jest następnie zastępowana ciągiem o indeksie tablicowym.
/ G powoduje, że funkcja lambda jest wywoływana wielokrotnie z każdą liczbą, która jest następnie zastępowana łańcuchem z tablicy.
W nowoczesnym JavaScript: -
źródło
To działało dla mnie:
źródło
using Array.prototype.reduce () :
Przykład
źródło
${f}
f zamiast wartości kumulacyjnej?${f}
.replace (new RegExp (Object.keys (s) [ 0], „g”), s [Object.keys (s) [0]]), zdanie 1) ”Na wypadek, gdyby ktoś zastanawiał się, dlaczego oryginalne rozwiązanie plakatu nie działa:
źródło
zwykła funkcja użytkownika, aby zdefiniować wzorzec do zamiany, a następnie użyć funkcji replace do pracy na ciągu wejściowym,
źródło
RegExp
obiektu może rozwiązać problemvar i = new RegExp('}','g'), j = new RegExp('{','g'), k = data.replace(i,'{').replace(j,'}');
Z moim pakietem „ zamień raz” możesz wykonać następujące czynności:
źródło
źródło
Możesz znaleźć i zastąpić ciąg za pomocą ograniczników.
źródło
/ * replaceSome metoda na ciągi, które pobiera, tyle argumentów, ile chcemy i zamienia je wszystkie na ostatni argument, który podaliśmy 2013 CopyRights zapisane dla: Max Ahmed to jest przykład:
* /
jsFiddle: http://jsfiddle.net/CPj89/
źródło
źródło
Napisałem ten pakiet npm stringinject https://www.npmjs.com/package/stringinject, który pozwala wykonać następujące czynności
który zastąpi {0} i {1} elementami tablicy i zwróci następujący ciąg
lub możesz zastąpić symbole zastępcze kluczami i wartościami obiektów takimi jak:
źródło
W tym celu możesz użyć https://www.npmjs.com/package/union-replacer . Jest to w zasadzie
string.replace(regexp, ...)
odpowiednik, który pozwala na wielokrotne zastępowanie w jednym przejściu przy jednoczesnym zachowaniu pełnej mocystring.replace(...)
.Ujawnienie: Jestem autorem. Biblioteka została opracowana w celu obsługi bardziej złożonych, konfigurowanych przez użytkownika zamienników i rozwiązuje wszystkie problematyczne rzeczy, takie jak grupy przechwytywania, odwołania wsteczne i zamiany funkcji zwrotnych.
Powyższe rozwiązania są jednak wystarczające do dokładnej zamiany łańcucha.
źródło
Rozbudowałem trochę @BenMcCormicks. Pracował dla zwykłych strun, ale nie, gdybym unikał znaków lub symboli wieloznacznych. Oto co zrobiłem
zwraca „bla bla 234433 bla bla”
W ten sposób dopasuje klucz do mapObj, a nie dopasowane słowo „
źródło
Rozwiązanie z Jquery (najpierw dołącz ten plik): Zamień wiele ciągów na wiele innych:
źródło
javascript tag added in question, and jquery is a libarary of javascript.
Hmmm, że logika jest wyłączona, powinna być odwrotna , a także tylko heads-up - z informacji o tagach javascript: „ O ile nie jest zawarty inny tag dla frameworka / biblioteki, należy oczekiwać czystej odpowiedzi JavaScript. ”