java - 正则表达式返回最后一个/和之间的数字?

标签 java regex

我试图在最后一个 / 和第一个 ? 之前的 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

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 个或多个字符和 ? (这里不需要转义)
  • (?=[?]|$) - 检查下一个字符是否为 ?或字符串结尾。如果不是,则匹配失败。

关于java - 正则表达式返回最后一个/和之间的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34651110/

相关文章:

c# - 自定义 ConfigurationElement 中的 ConfigurationProperty 出现意外的 RegexStringValidator 失败

c - 用于解析函数命令行参数的正则表达式

Java是OOP语言。我们可以通过创建对象来调用它,也可以像 POP 一样使用它。但这有什么问题呢?

java - Android SDK 空指针异常

php - 使用 preg_match_all 从字符串中提取图像 SRC

javascript - 正则表达式只替换匹配的一部分

javascript - JS正则表达式替换字符串中的数字

c# - 带有 Java 的 Map、Set、HashMap 的 .NET 端口

java - Struts 2 为某些操作添加异常映射

java - 无法连接到数据库:l