java - 字符串中的第 N 个索引?

标签 java regex string url split

我需要提取 URL 的子字符串。

网址

  • /service1/api/v1.0/foo -> foo
  • /service1/api/v1.0/foo/{fooId} -> foo/{fooId}
  • /service1/api/v1.0/foo/{fooId}/boo -> foo/{fooId}/boo

其中一些 URL 可能包含请求参数。

代码

String str = request.getRequestURI();
str = str.substring(str.indexOf("/") + 1);
str = str.substring(str.indexOf("/") + 1);
str = str.substring(str.indexOf("/") + 1);
str = str.substring(str.indexOf("/") + 1, str.indexOf("?"));

是否有更好的方法来提取子字符串,而不是重复使用 indexOf 方法?

最佳答案

有很多替代方法:

  1. 在带有 \ 分隔符的分割字符串上使用 Java-Stream API:

    String str = "/service1/api/v1.0/foo/{fooId}/boo";  
    String[] split = str.split("\\/");
    String url = Arrays.stream(split).skip(4).collect(Collectors.joining("/"));
    System.out.println(url);
    

    删除参数后,Stream 将如下所示:

    String url = Arrays.stream(split)
        .skip(4)
        .map(i -> i.replaceAll("\\?.+", ""))
        .collect(Collectors.joining("/"));
    
  2. 这也是Regex的地方取代它的位置!使用 Pattern 和 Matcher 类。

    String str = "/service1/api/v1.0/foo/{fooId}/boo";
    
    Pattern pattern = Pattern.compile("\\/.*?\\/api\\/v\\d+\\.\\d+\\/(.+)");
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }
    

如果您依赖 indexOf(..) 用法,您可能需要使用 while 循环。

String str = "/service1/api/v1.0/foo/{fooId}/boo?parameter=value"; 

String string = str;
while(!string.startsWith("v1.0")) {
    string = string.substring(string.indexOf("/") + 1);
}

System.out.println(string.substring(string.indexOf("/") + 1, string.indexOf("?")));

其他答案包括一种方法,如果前缀不可变,您可能只想使用一次 idndexOf(..) 方法调用 ( @JB Nizet ):

string.substring("/service1/api/v1.0/".length(), string.indexOf("?"));
<小时/>

所有这些解决方案都基于您的输入和事实,模式已知,或者至少是用 \ 分隔的上一节的编号或版本 v1.0 作为检查点 - 最佳解决方案可能不会出现在这里,因为 URL 的组合有无限种。您必须了解输入 URL 的所有可能组合才能找到处理它的最佳方法。

关于java - 字符串中的第 N 个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50974311/

相关文章:

string - ColdFusion 静态键/值列表?

string - 在 COBOL 中查找子字符串的索引

java - 使用 Java keytool 的 PKCS11 格式 key

java - 从 Java 运行 Python 脚本

javascript - 转义 Javascript 字符串,未终止的字符类错误

javascript - RegExp 等价于 array.indexOf( str )

java - 使用java继承获取子类中的属性?

java - 运行具有文件系统和端口限制的本地 Java 应用程序

javascript - 检查字符串是否包含日文/中文字符

python - 创建字符串的变体