我试图在最后一个 /
和第一个 ?
之前的 URL 末尾选择 id
示例:http://www.website.com/page/support/28685875?JK.kj_id=
只会提取 id:28685875
我对正则表达式很糟糕,但已经弄明白了这些
([^/]+$)
选择结束28685875?JK.kj_id=
.+?(?=\?)
选择开始www.website.com/page/support/28685875
我想尝试以各种方式将它们组合在一起,但几个小时后我没有成功。
任何人都可以阐明我做错了什么/如何选择这个 URL 部分吗?
编辑:我正在使用基于 Java 的 ETL 应用程序来转换数据集。
最佳答案
非正则表达式解决方案
在 Java 中,您可以使用 URL class解析网址。因此,最好的解决方案是:
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 个或多个字符和?
(这里不需要转义) -
(?=[?]|$)
- 检查下一个字符是否为?
或字符串结尾。如果不是,则匹配失败。
关于java - 正则表达式返回最后一个/和之间的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34651110/