2013-08-28 14 views
5

Nie rozumiem tego wyrażenia regularnego i chcę utworzyć takie, które pasuje do dwóch ciągów.Wyrażenie regularne JavaScript pasujące do dwóch ciągów znaków

wiem, że na jednej strunie kod jest .match(/something/) a jeśli mecze na dwóch ciągów jest .match(/something|someotherthing/)

Jak napisać taki, który pasuje tylko wtedy, gdy oba ciągi są znalezione w tekście np „Google Microsoft”

Odpowiedz

9

Aby zrobić to za pomocą pojedynczego wyrażenia regularnego, musisz uwzględnić fakt, że mogą pojawić się w dowolnej kolejności. (.* dopasowuje żadnych znaków pomiędzy dwoma podciągi):

/google.*microsoft|microsoft.*google/ 

Uwaga: Jeśli chcesz zrobić więcej niż 2 podciągi to by wymknąć się spod kontroli. 3 ciągi mogą przychodzić w różnych zamówieniach, 5 ciągów może być w zamówieniach 120, a 10 podciągów może być zamówionych na różne sposoby 3628800! Dlatego korzystanie z funkcji języka (Javascript), jak w przypadku odpowiedzi na "Wybuchowe pigułki", może być znacznie lepsze niż próba wykonania zbyt dużej ilości wyrażeń regularnych.

5

można po prostu użyć .match dwukrotnie

str.match(/google/) && str.match(/microsoft/) 

W tym przypadku może być szybsze w użyciu .indexOf

Można również użyć opisowy regex

.match(/google.*microsoft|microsoft.*google/) 
+0

@ m.buettner doskonały punkt. –

+0

Wiem, że mogę użyć 'match' dwa razy, ale chciałem go z regex, aby było krótsze .. ale z regex wydaje się być dłuższy niż przy użyciu' match' dwa razy – Enve

+0

@Enve krótki kod niekoniecznie jest najbardziej czytelny. Zwłaszcza jeśli "długi" kod pasuje już do jednej lub dwóch linii. –

6

Pozostałe odpowiedzi są doskonale dobrze dla twojego konkretnego problemu, ale jak zauważył Paulpro, naprawdę wymykasz się spod kontroli, gdy masz więcej niż dwa słowa.

Najprostszym wyjściem jest użycie wielu czeków, jak sugerują Pigułki Eksplozyjne.

Ale bardziej skalowalnym regex tylko podejść można użyć lookaheads:

/^(?=.*google)(?=.*microsoft)(?=.*apple).../ 

uprzedzona faktycznie nie spożywać niczego, więc po pierwszym warunkiem jest sprawdzany (to .*google można dopasować), jesteś z powrotem na początku łańcucha i może sprawdzić następny warunek. Wzór przechodzi tylko wtedy, gdy wszystkie wyprzedzające.

Należy pamiętać, że jeśli dane wejściowe mogą zawierać znaki końca wiersza, nie będzie możliwe wykonanie .*. Będziesz musiał zamiast tego użyć [^]* lub [\s\S]* (to samo dotyczy odpowiedzi innych).

Powiązane problemy