/ / Regex Najpierw pasujący większy ciąg - wyrażenie regularne

Regex Dopasuj większy ciąg pierwszy - regex

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 № 1

Usunąć .* 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