Chciałbym stworzyć String.replaceAll()
metodę w JavaScript i myślę, że użycie wyrażenia regularnego byłoby najkrótszym sposobem na zrobienie tego. Nie mogę jednak wymyślić, jak przekazać zmienną do wyrażenia regularnego. Mogę to zrobić już, która zastąpi wszystkie wystąpienia "B"
z "A"
.
"ABABAB".replace(/B/g, "A");
Ale chcę zrobić coś takiego:
String.prototype.replaceAll = function(replaceThis, withThis) {
this.replace(/replaceThis/g, withThis);
};
Ale oczywiście zastąpi to tylko tekst "replaceThis"
... więc jak przekazać tę zmienną do mojego łańcucha wyrażeń regularnych?
javascript
regex
JC Grubbs
źródło
źródło
Odpowiedzi:
Zamiast używać
/regex/g
składni, możesz zbudować nowy obiekt RegExp :W ten sposób można dynamicznie tworzyć obiekty wyrażeń regularnych. Następnie zrobisz:
źródło
/\/word\:\w*$/
należy uciec swoje backslashy:new RegExp( '\\/word\\:\\w*$' )
./
nie ma specjalnego znaczenia, jeśli konstruujesz wyrażenie regularne z łańcucha, więc nie musisz przed nim uciekać./\/word\:\w*$/
powinien byćnew RegExp('/word\\:\\w*$')
Jak wspomniał Eric Wendelin, możesz zrobić coś takiego:
To daje
"regex matching ."
. Jednak zakończy się niepowodzeniem, jeśli str1 jest"."
. Można się spodziewać, że wynik będzie"pattern matching regex"
, zastępując kropkę"regex"
, ale okaże się, że ...Wynika to z faktu, że chociaż
"."
jest ciągiem, w konstruktorze RegExp jest nadal interpretowany jako wyrażenie regularne, co oznacza dowolny znak nieliniowy, oznaczający każdy znak w ciągu. W tym celu przydatna może być następująca funkcja:Następnie możesz zrobić:
poddający się
"pattern matching regex"
.źródło
-
i obejmuje=!:/
.Jak zawsze: nie używaj wyrażenia regularnego, chyba że musisz. W przypadku prostej zamiany ciągu idiomem jest:
Nie musisz się więc martwić o kwestie cytowania wspomniane w odpowiedzi Gracenotes.
źródło
split
ireplace
mogą przyjmować ciąg znaków lubRegExp
obiekt. Problem,replace
który tegosplit
nie robi, polega na tym, że gdy używasz łańcucha, dostajesz tylko jedną zamiennik.Jeśli chcesz uzyskać WSZYSTKIE wystąpienia (
g
), nie rozróżniaj wielkości liter (i
) i używaj granic, aby nie było to słowo w innym słowie (\\b
):Przykład:
źródło
rx
interpolacją Emacs / styl, za pomocą ciągów szablonów.)Dla każdego, kto chce użyć zmiennej z metodą dopasowania , to zadziałało dla mnie
źródło
To:
jest równoważne z tym:
Zobacz http://www.w3schools.com/jsref/jsref_obj_regexp.asp .
źródło
pattern
jako zmiennej, w drugim jako ciąg znakówźródło
Chcesz dynamicznie budować wyrażenie regularne, a do tego poprawnym rozwiązaniem jest użycie
new RegExp(string)
konstruktora. Aby konstruktor mógł traktować znaki specjalne dosłownie , musisz uciec od nich. W widżecie autouzupełniania interfejsu jQuery jest wbudowana funkcja o nazwie$.ui.autocomplete.escapeRegex
:Jeśli używasz interfejsu jQuery, możesz użyć tej funkcji lub skopiować jej definicję ze źródła :
I użyj tego w ten sposób:
źródło
Przetestuj za pomocą tego narzędzia
źródło
Przetestuj jak:
źródło
Oto kolejna implementacja replaceAll:
źródło
I wersja odpowiedzi Stevena Penny'ego na coffeescript, ponieważ jest to wynik google nr 2 ... nawet jeśli kawa to tylko javascript z usuniętą dużą liczbą znaków ...;)
aw moim szczególnym przypadku
źródło
robot.name=hubot
nie jest javascript.Chociaż możesz tworzyć dynamicznie tworzone RegExp (zgodnie z innymi odpowiedziami na to pytanie), powtórzę mój komentarz z podobnego postu : Funkcjonalna forma String.replace () jest niezwykle przydatna i w wielu przypadkach zmniejsza potrzebę dynamicznie tworzone obiekty RegExp. (które są trochę uciążliwe, ponieważ musisz wyrazić dane wejściowe do konstruktora RegExp jako ciąg znaków zamiast używać formatu literalnego slash / [AZ] + / regexp)
źródło
Aby zaspokoić potrzebę wstawienia zmiennej / aliasu / funkcji do wyrażenia regularnego, oto co wymyśliłem:
gdzie „oldre” jest oryginalnym wyrażeniem regularnym, w którym chcę wstawić zmienną, „xx” jest symbolem zastępczym dla tej zmiennej / aliasu / funkcji, a „yy” jest rzeczywistą nazwą, aliasem lub funkcją zmiennej.
źródło
Możesz użyć tego, jeśli 1 USD nie działa z tobą
źródło
Zawsze możesz używać
indexOf
wielokrotnie:To nie przechodzi w nieskończoną pętlę, gdy zamiennik zawiera dopasowanie.
źródło
Twoje rozwiązanie jest tutaj:
Przekaż zmienną do wyrażenia regularnego.
Zaimplementowałem to, pobierając wartość z pola tekstowego, które chcesz zastąpić, a innym jest pole tekstowe „zamień na”, uzyskując wartość z pola tekstowego w zmiennej i ustawiając zmienną na RegExp funkcja do dalszej wymiany. W moim przypadku korzystam z Jquery, możesz to również zrobić tylko przez JavaScript.
Kod JavaScript:
Ten kod znajduje się na zdarzeniu przycisku Onclick, możesz ustawić tę funkcję w celu wywołania.
Więc teraz możesz przekazać zmienną w funkcji zamień.
źródło
Ta funkcja wywołująca będzie iterować za pomocą replaceerItems za pomocą indeksu i zmieniać globalnie replaceerItems [indeks] w ciągu każdego przejścia.
źródło
Żadna z tych odpowiedzi nie była dla mnie jasna. W końcu znalazłem dobre wytłumaczenie na http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/
Prosta odpowiedź brzmi:
Na przykład:
źródło
var
tutaj używać . Ponadto, jeśli zdasz\b
lub\1
pęknie.W przypadku wielokrotnego zastąpienia bez wyrażeń regularnych wybrałem następujące:
Tutaj znaleziono ważną część rozwiązania
źródło