2013-08-01 9 views
5

Moja wiedza regex ucieka mi w tym jednego ...Regex dopasować ampersandy w URI, które są następnie przez równych sobie, a nie inny ampersand

że mam URL z URI jako parametr kwerendy, ala :

http://hostname.com?uri=http://website.com/company/YoYo+&+Co+Inc&type=company 

... zakładając naszą uri param nie zawiera żadnych params się, chcę ręcznie analizować z params zapytań w JavaScript, ale oczywiście ampersand w naszym osadzonym uri param utrudnia potem po prostu dzielenie na wszystkie amperandy i uruchamianie z niego stamtąd.

Co naprawdę chcę zrobić, to zdefiniować wyrażenie regularne, które dopasowuje tylko znaki zapytania i ampersandy, po których następują równe wartości, po czym następuje kolejny znak ampersand (lub koniec linii). Wpadłem na ten, który jest blisko, ale jest w tym tekst nie przechwytywania, jak również i nie jestem pewien, dlaczego:

[?&](?:[^&]+)= 

... że wyniki w meczu na ?uri= jak również &type= który jest zbliżony ale przechwytując więcej niż chcę. Co robię źle tak, że nie przechwytuje tylko ? i & w meczach? Innymi słowy, powinno to być przechwytywanie tylko przed uri i ? przed typem.

+1

Czy możesz podać przykład tego, co chcesz dopasować? Nie bardzo rozumiem, jaki jest cel. – JDiPierro

+0

Zaktualizowany, aby miejmy nadzieję, być nieco bardziej przejrzysty ... – James

+0

Sprawdź http://papermashup.com/read-url-get-variables-withjavascript/ – igasparetto

Odpowiedz

6

Jeśli dobrze rozumiem i po prostu chcesz dopasować? lub & wówczas regex powinny być:

[?&](?==) 

Objaśnienie:

[?&] jest zbiorem znaków zawierających tylko? i &. Oznacza to, że będzie szukał jednego z nich.

(?=) To pozytywna recenzja. Oznacza to "To musi nastąpić po głównym meczu, ale go nie uwzględniaj". Tak aby znaleźć an = wygląda trochę dziwnie jak (?==)


Jeśli chcesz zawierać słowo „uri” lub „typ”, a następnie dodać \w po zestawu znaków i przed uprzedzona:

[?&]\w+(?==) 

+ oznacza „mecz 1 lub więcej”


i jeszcze jeden w przypadku, gdy nie jest to dokładnie to, czego szukasz! Jeśli chcesz się pozbyć & /? ale zachowaj tekst, który byśmy zawinął zestaw znaków w pozytywnym styluBEHIND. Składnia tego to (?<=). To by zmienić regex do tego:

(?<=[?&])\w+(?==) 

przykładem w pracy: http://regexr.com?35q0u


W réponse do komentarza: można dopasować tylko?i & umieszczając \ w + wewnątrz pozytywnego uprzedzona:

[?&](?=\w+=) 

A ponieważ jestem znudzony i jak regexs trochę za dużo, tu jest jeden, który będzie pasował do wartości tagu:

(?<==).*?(?=[&?]\w+=|$) 

Przykład: http://regexr.com?35q11 Istnieje wiele wyróżnionych sekcji, ponieważ globalne dopasowanie jest włączone.

+0

Bo nie masz? lub &, a następnie a =. Czy chcesz też dopasować słowo "uri"? W takim przypadku powinno to być następujące: http://regexr.com?35q0r – JDiPierro

+0

Zamknij ... Chcę tylko dopasować & i? po którym następuje znak = przed znakiem ampersand. Ale chcę tylko przechwycić * i?, A nie tekst następujący. – James

+0

tj. ... Nie mogę wymyślić, jak wykonać * non * -capture, wciąż robiąc mecz. – James

Powiązane problemy