Próbuję przeanalizować ciągi zakodowane w postaci adresu URL, które składają się z par klucz = wartość oddzielonych przez albo &
lub &
.
Poniższe elementy dopasują tylko pierwsze wystąpienie, dzieląc klucze i wartości na oddzielne elementy wyników:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/)
Wyniki dla ciągu „1111342 = Adam% 20Franco & 348572 = Bob% 20Jones” byłyby następujące:
['1111342', 'Adam%20Franco']
Użycie flagi globalnej „g” spowoduje dopasowanie wszystkich wystąpień, ale zwróci tylko w pełni dopasowane podciągi, a nie rozdzielone klucze i wartości:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/g)
Wyniki dla ciągu „1111342 = Adam% 20Franco & 348572 = Bob% 20Jones” byłyby następujące:
['1111342=Adam%20Franco', '&348572=Bob%20Jones']
Chociaż mógłbym podzielić ciąg &
i rozdzielić każdą parę klucz / wartość osobno, czy istnieje sposób, aby użyć obsługi wyrażeń regularnych JavaScript, aby dopasować wiele wystąpień wzorca, /(?:&|&)?([^=]+)=([^&]+)/
podobnie jak preg_match_all()
funkcja PHP ?
Staram się znaleźć jakiś sposób, aby uzyskać wyniki z oddzielnymi dopasowaniami, na przykład:
[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]
lub
[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]
źródło
replace
tutaj używania .var data = {}; mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, function(a,b,c,d) { data[c] = d; });
Gotowe. „matchAll” w JavaScript to „zamień” zastępczą funkcją obsługi zamiast ciągu.Odpowiedzi:
Podniesiony z komentarzy
Obsługę przeglądarek można znaleźć tutaj https://caniuse.com/#feat=urlsearchparams
Sugerowałbym alternatywne wyrażenie regularne, wykorzystujące podgrupy do przechwytywania nazw i wartości parametrów indywidualnie oraz
re.exec()
:result
jest obiektem:Wyrażenie regularne rozkłada się w następujący sposób:
źródło
x = y
przypisałoby sięy
do,x
a także wyprodukowały
). Kiedy zastosujemy tę wiedzę doif (match = re.exec(url))
: To A) wykonuje przypisanie i B) zwraca wynikre.exec(url)
dowhile
. Terazre.exec
zwraca,null
jeśli nie ma dopasowania, co jest fałszywą wartością. W efekcie pętla będzie trwała tak długo, jak długo będzie pasować.Do wyszukiwania globalnego musisz użyć przełącznika „g”
źródło
Edycja 2020
Użyj URLSearchParams , ponieważ ta praca nie wymaga już żadnego niestandardowego kodu. Przeglądarki mogą to zrobić za Ciebie za pomocą jednego konstruktora:
plony
Nie ma więc powodu, aby używać do tego regex.
Oryginalna odpowiedź
Jeśli nie chcesz polegać na „dopasowywaniu na ślepo”, które towarzyszy
exec
dopasowaniu stylu, JavaScript ma wbudowaną funkcję dopasowywania wszystkiego, ale jest częściąreplace
wywołania funkcji, gdy używa się opcji „co zrobić z przechwytywaniem funkcja obsługi grup :Gotowe.
Zamiast używać funkcji obsługi grup przechwytywania do faktycznego zwracania ciągów zastępczych (w celu obsługi zamiany pierwszy argument jest pełnym dopasowaniem wzorca, a kolejne argumenty są indywidualnymi grupami przechwytywania), po prostu bierzemy przechwytywania grup 2 i 3 i buforujemy tę parę.
Tak więc, zamiast pisać skomplikowane funkcje analizujące, pamiętaj, że funkcja „matchAll” w JavaScript jest po prostu „zastąpieniem” zastępczą funkcją obsługi i można uzyskać znaczną wydajność dopasowywania wzorców.
źródło
something "this one" and "that one"
. Chcę umieścić wszystkie ciągi w podwójnych cudzysłowach na liście, tj. [Ten, tamten]. Jak dotądmystring.match(/"(.*?)"/)
działa dobrze przy wykrywaniu pierwszego z nich, ale nie wiem, jak dostosować twoje rozwiązanie do pojedynczej grupy przechwytywania.Do przechwytywania grup jestem przyzwyczajony do używania
preg_match_all
w PHP i próbowałem tutaj odtworzyć jego funkcjonalność:źródło
/g
przeciwnym razie uruchomienieexec()
nie zmieni bieżącego indeksu i będzie się zapętlać na zawsze.Ustaw
g
modyfikator dla dopasowania globalnego:źródło
Źródło:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
Znajdowanie kolejnych dopasowań
Jeśli Twoje wyrażenie regularne używa flagi „g”, możesz użyć metody exec () wiele razy, aby znaleźć kolejne dopasowania w tym samym ciągu. Gdy to zrobisz, wyszukiwanie rozpocznie się od podłańcucha ciągu określonego przez właściwość lastIndex wyrażenia regularnego (test () również przesunie właściwość lastIndex). Na przykład załóżmy, że masz ten skrypt:
Ten skrypt wyświetla następujący tekst:
Uwaga: Nie umieszczaj literału wyrażenia regularnego (ani konstruktora RegExp) w warunku while, ponieważ spowoduje to utworzenie nieskończonej pętli, jeśli istnieje dopasowanie, ponieważ właściwość lastIndex jest resetowana po każdej iteracji. Upewnij się również, że flaga globalna jest ustawiona, w przeciwnym razie również wystąpi pętla.
źródło
String.prototype.match
zg
flagą:'abbcdefabh'.match(/ab*/g)
powroty['abb', 'ab']
Jeśli ktoś (taki jak ja) potrzebuje metody Tomalaka z obsługą tablic (czyli wielokrotnego wyboru), oto ona:
Wejście
?my=1&my=2&my=things
wynik
1,2,things
(wcześniej zwrócone tylko: rzeczy)źródło
Aby pozostać przy proponowanym pytaniu wskazanym w tytule, możesz iterować po każdym dopasowaniu w ciągu za pomocą
String.prototype.replace()
. Na przykład poniższe robi właśnie to, aby uzyskać tablicę wszystkich słów na podstawie wyrażenia regularnego:Gdybym chciał uzyskać grupy przechwytywania lub nawet indeks każdego dopasowania, też mógłbym to zrobić. Poniżej pokazano, jak każde dopasowanie jest zwracane z całym dopasowaniem, pierwszą grupą przechwytywania i indeksem:
Po uruchomieniu powyższego
words
będzie wyglądał następująco:Aby dopasować wiele wystąpień podobnych do tego, co jest dostępne w PHP
preg_match_all
, możesz użyć tego typu myślenia, aby stworzyć własne lub użyć czegoś podobnegoYourJS.matchAll()
. YourJS mniej więcej definiuje tę funkcję w następujący sposób:źródło
YourJS.parseQS()
( yourjs.com/snippets/56 ), chociaż wiele innych bibliotek również oferuje tę funkcję.Jeśli możesz uciec z korzystaniem z
map
tego, jest to rozwiązanie czteroliniowe:Nie jest ładny, nie jest wydajny, ale przynajmniej jest kompaktowy. ;)
źródło
Zastosowanie
window.URL
:źródło
Hеllo od 2020 roku. Zwrócę uwagę na String.prototype.matchAll () :
Wyjścia:
źródło
Aby przechwycić kilka parametrów o tej samej nazwie, zmodyfikowałem pętlę while w metodzie Tomalaka w następujący sposób:
Wejście:
?firstname=george&lastname=bush&firstname=bill&lastname=clinton
zwroty:
{firstname : ["george", "bill"], lastname : ["bush", "clinton"]}
źródło
?cinema=1234&film=12&film=34
bym się spodziewał{cinema: 1234, film: [12, 34]}
. Zredagowałem odpowiedź, aby to odzwierciedlić.Cóż ... Miałem podobny problem ... Chcę wyszukiwania przyrostowego / krokowego za pomocą RegExp (np .: rozpocznij wyszukiwanie ... wykonaj jakieś przetwarzanie ... kontynuuj wyszukiwanie do ostatniego dopasowania)
Po wielu poszukiwaniach w Internecie ... jak zawsze (to teraz staje się nawykiem) ląduję w StackOverflow i znalazłem odpowiedź ...
To, czego nie ma, a sprawy, o których należy wspomnieć, to „
lastIndex
” Teraz rozumiem, dlaczego obiekt RegExp implementuje właściwość „lastIndex
”źródło
Dzielenie wygląda dla mnie na najlepszą opcję:
źródło
Aby uniknąć piekła wyrażeń regularnych, możesz znaleźć swoje pierwsze dopasowanie, odetnij kawałek, a następnie spróbuj znaleźć następny na podłańcuchu. W C # wygląda to mniej więcej tak, przepraszam, że nie przeniosłem go do JavaScript.
źródło