我需要提取 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
方法?
最佳答案
有很多替代方法:
在带有
\
分隔符的分割字符串上使用 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("/"));
这也是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/