我尝试在最终/
之间和第一个?
之前的网址末尾选择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应用程序来转换数据集。
答案 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 demo
否定字符类[^\/]
匹配除/
之外的任何字符。第1组将保留您需要的价值。
要仅匹配您需要使用的子字符串:
(?<=/)[^/]*(?=[?][^/]*$)
^^^^^ ^^^
或更简单的一个:
(?<=/)[^/?]+(?=[?]|$)
请参阅demo
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而不进行分组。