2015-10-07 82 views
0

我想這個字符串匹配:正則表達式匹配更大的字符串第一

www.abcdgbs.com/p/Flights/abcd 

與來自多個正則表達式

匹配分離的正則表達式

regex = ".*(/Hotels|(/p)?/Flights).*"; 

管我想要得到的索引,其中,這個字符串是匹配的(在上面的例子中是15) 我的代碼是

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); 

它無視航班/ p和匹配給我指數17, 我想這第一場比賽有更大的字符串即/p/Flights第一,給指數爲15。

我想用正則表達式相同的匹配www.abcdgbs.com/Flights/abcd也是如此。從你的正則表達式

+0

的Java?請改用URI。 – nhahtdh

回答

1

刪除.*和匹配你想要的文字:

String regex = "(/Hotels|(/p)?/Flights)"; 

與這些關鍵字之前,您正則表達式的貪婪.*,正則表達式引擎正試圖之前任何這些關鍵詞來最長的字符串匹配作爲(/p)?是可選的。

因此,與.*你的第一個捕獲組是/Flights.*刪除你的第一個捕獲組是/p/Flights

您將獲得15現在打印。

0

這裏是我的擴展版本:

(?:(?:(?P<PROTOCOL>https?):)?//)?(?P<DOMAIN>.+?)/(?P<PREFIX>p/)?(?P<TYPE>Flights|Hotels)(?P<SUFFIX>/.+)? 

見這裏的顏色:https://regex101.com/r/wD7aR7/2