我正在尝试匹配此字符串:
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 。
答案 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