2015-10-07 51 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

相关问题