Próbuję dopasować ten ciąg:
www.abcdgbs.com/p/Flights/abcd
z regex
regex = ".*(/Hotels|(/p)?/Flights).*";
rura oddzielona dla dopasowania z wielu wyrażeń regularnych
Chcę uzyskać indeks, w którym pasuje ten ciąg (15 w powyższym przypadku) mój kod to
String test = "www.abcdgbs.com/p/Flights/abcd";
String regex = ".*(/Hotels|(/p)?/Flights).*";
Pattern patt = Pattern.compile(regex);
Matcher m = patt.matcher(test);
System.out.println(m.find() ? m.start(1) : -1);
Ignoruje / p i dopasowuje z lotów, dając mi indeks jako 17, Chcę, aby to najpierw pasowało do większego łańcucha, tj. /p/Flights
najpierw i podaj indeks jako 15.
Chcę użyć tego samego wyrażenia regularnego do dopasowania www.abcdgbs.com/Flights/abcd także.
Odpowiedzi:
1 dla odpowiedzi № 1Usunąć .*
z wyrażenia regularnego i dopasuj żądany tekst:
String regex = "(/Hotels|(/p)?/Flights)";
Z chciwością .*
w wyrażeniu regularnym przed tymi słowami kluczowymi silnik wyrażeń regularnych próbuje dopasować najdłuższy ciąg przed którymkolwiek z tych słów kluczowych jako twoim (/p)?
jest opcjonalne.
Tak z .*
twoja pierwsza złapana grupa to /Flights
ale z .*
usunięto twoją pierwszą przechwyconą grupę /p/Flights
.
Dostaniesz 15
wydrukowano teraz.
0 dla odpowiedzi nr 2
Oto moja rozszerzona wersja:
(?:(?:(?P<PROTOCOL>https?):)?//)?(?P<DOMAIN>.+?)/(?P<PREFIX>p/)?(?P<TYPE>Flights|Hotels)(?P<SUFFIX>/.+)?
Zobacz w kolorach tutaj: https://regex101.com/r/wD7aR7/2