2012-01-26 15 views
9

Próbuję uzyskać opcjonalny widok z wyprzedzeniem, ale mam problem z tym, gdy tylko zrobię to opcjonalnie (dodam po nim ?), nie pasuje on już nawet wtedy, gdy dane tam są.Opcjonalny widok z wyprzedzeniem dla regex

Podsumowując, staram się wyciągnąć określone parametry zapytania z URI. Przykład:

/.*foo.html\??(?=.*foo=([^\&]+))(?=.*bar=([^\&]+))/ 
    .exec('foo.html?foo=true&bar=baz') 

będę rozpadu, który się nieco:

.*foo.html\??  // filename == `foo.html` + '?' 
(?=.*foo=([^\&]+)) // find "foo=...." parameter, store the value 
(?=.*bar=([^\&]+)) // find "bar=...." parameter, store the value 

Powyższy przykład działa perfekcyjnie, pod warunkiem, że oba foo i bar istnieć jako parametry w kwerendy. Problem jest, że próbuję zrobić to opcjonalne, więc zmieniłem go na adres:

/.*foo.html\??(?=.*foo=([^\&]+))?(?=.*bar=([^\&]+))?/ 
           ↑     ↑ 
    Added these question marks ─┴──────────────────┘ 

i już nie pasuje do żadnych parametrów, choć nadal pasuje foo.html. Jakieś pomysły?

+0

Dlaczego używasz do tego wyrażeń regularnych? Po prostu podziel łańcuch i zapamiętaj pary klucz/wartość w obiekcie. – ThiefMaster

+0

@ ThiefMaster - Ponieważ chcę :) A teraz chcę jeszcze więcej, że to nie zadziała. W rzeczywistości jest tak dlatego, że kod jest znacznie krótszy, gdy potrzebuję uzyskać 2 parametry. –

+0

Dlaczego potrzebujesz przewinięcia z wyprzedzeniem? Aby dopasować także foo.html? Bar = baz & foo = true? – Bergi

Odpowiedz

4

spróbować umieścić znaki zapytania w antycypowana:

...((?=(?:.*foo=([^\&]+))?)... 

wygląda dziwnie, ale myślę, przystojnym regex nie było celem :-)

Również cię mieć myślałem o tym?

/.*foo.html\??.*(?:foo|bar)=([^\&]+).*(?:bar|foo)=([^\&]+)/ 
+1

Dzięki, pierwszy działa. Myślę, że jest to wymagane, ponieważ silnik może optymalizować '(? =)?' Całkowicie (tzn. Po prostu go ignorować), ponieważ opcjonalne niespełniające się wyrażenie regularne jest, no cóż, bezcelowe. Po prostu używam go, by złapać coś innego. Twój drugi też by działał, oprócz tego, że potrzebowałby kilku poprawek, aby każdy parametr był opcjonalny, i jest trochę więcej logiki po fakcie, ponieważ musisz dowiedzieć się, który parametr jest gdzie (musisz usunąć dwa? : '' a następnie sprawdzić przeciwko tym) –

+0

W każdym razie, czyniąc z wyprzedzeniem opcjonalny prowadziłoby do dopasowania pusty ciąg. – Bergi

Powiązane problemy