【问题标题】:Regex Matching bigger String first正则表达式首先匹配更大的字符串
【发布时间】:2015-10-07 09:56:30
【问题描述】:

我正在尝试匹配这个字符串:

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

【问题讨论】:

  • Java?请改用 URI。

标签: regex


【解决方案1】:

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

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

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

因此,使用.*,您的第一个捕获组是/Flights,但删除.*,您的第一个捕获组是/p/Flights

您现在将得到15 打印。

【讨论】:

    【解决方案2】:

    这是我的扩展版本:

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

    在此处查看颜色:https://regex101.com/r/wD7aR7/2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-05
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多