正则表达式返回最后一个/和?

时间:2016-01-07 09:08:43

标签: java regex

我尝试在最终/之间和第一个?之前的网址末尾选择ID 例如:http://www.website.com/page/support/28685875?JK.kj_id=

只会提取ID:28685875

我对正则表达式非常糟糕,并且已经找到了这些

  • ([^/]+$)选择结束28685875?JK.kj_id=

  • .+?(?=\?)选择了开始www.website.com/page/support/28685875

我想尝试以各种方式将它们组合在一起,但几个小时后我就没有成功。

有人能说清楚我做错了什么/如何选择这个网址部分吗?

编辑:我正在使用基于java的ETL应用程序来转换数据集。

2 个答案:

答案 0 :(得分:2)

非注册解决方案

在Java中,您可以使用URL class来解析URL。所以,最好的解决方案是:

URL aURL = new URL("http://www.website.com/page/support/28685875?JK.kj_id=");
String str = aURL.getPath().substring(aURL.getPath().lastIndexOf("/") + 1);
System.out.println(str);

请参阅demo

请参阅Parsing a URL教程。

REGEX SOLUTION

您要查找的正则表达式应与最后/后跟数字或符号?之后的任何符号相匹配,这些符号后面还可能跟/以外的可选字符结尾串。 /?之间的部分可以捕获到一个组中然后使用。

\/([^\/]*)\?[^\/]*$

请参阅regex demo

否定字符类[^\/]匹配除/之外的任何字符。第1组将保留您需要的价值。

要仅匹配您需要使用的子字符串:

(?<=/)[^/]*(?=[?][^/]*$)
^^^^^      ^^^

或更简单的一个:

(?<=/)[^/?]+(?=[?]|$)

请参阅demo

Java code

String s = "http://w...content-available-to-author-only...e.com/page/support/28685875?JK.kj_id=";
Pattern pattern = Pattern.compile("(?<=/)[^/?]+(?=[?]|$)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group()); 
} 

但是,您可以使用基于捕获的正则表达式并使用matcher.group(1)访问第1组。

(?<=/)([^/?]+)(?=[?]|$)模式执行以下操作:

  • (?<=/) - 检查字符串中当前测试位置之前是否有/(如果失败,则索引提前,下一个位置被测试)
  • [^/?]+ - 匹配/?以外的1个或多个字符(此处无需转义)
  • (?=[?]|$) - 检查下一个字符是?还是字符串结尾。如果没有,请将比赛失败。

答案 1 :(得分:2)

试试这个:

\/([^\/\?]+)(?:\?|$)

这将在最后一个“/”之后和“?”之前获取任何字符,如果“?”存在。这里第一组将为您提供ID。

简化

(?<=\/)([^\/\?]+)(?=\?|$)

这将获取ID而不进行分组。