正则表达式首先匹配更大的字符串

时间:2015-10-07 09:56:30

标签: regex

我正在尝试匹配此字符串:

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并匹配来自Flights的索引为17, 我希望首先匹配较大的字符串,即/p/Flights,然后将索引设为15。

我想使用相同的正则表达式匹配 www.abcdgbs.com/Flights/abcd

2 个答案:

答案 0 :(得分:1)

从正则表达式中删除.*并匹配您想要的文字:

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

在这些关键字之前的正则表达式中使用贪婪的.*,正则表达式引擎会尝试匹配任何这些关键字之前的最长字符串,因为(/p)?是可选的。

因此,.*您首次捕获的群组为/Flights但删除了.*后,您首先捕获的群组为/p/Flights

您现在将打印15

答案 1 :(得分:0)

这是我的扩展版本:

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

请参阅此处的颜色:https://regex101.com/r/wD7aR7/2