我有一个字符串,例如:
String test1 = "https://31.191.110.125:443/App/ws/list/play";
String test2 = "https://31.191.110.125:443/App/ws/list";
我希望上述两个字符串的子字符串输出均为/ws/list
从/ws/
到第一个/
或字符串的结尾(如果没有/
String sub = test1.substring(test1.indexOf("/ws/"), test1.lastIndexOf("/"));
System.out.println("Substring: " + sub);
以上内容适用于test1字符串,但不适用于test2字符串。 如何为test2字符串执行此操作?
答案 0 :(得分:2)
您可以使用正则表达式:
/ws/.*?(?=/|$)
像这样
Matcher m = Pattern.compile("/ws/.*?(?=/|$)").matcher("https://31.191.110.125:443/App/ws/list");
if (m.find()) {
System.out.println(m.group());
} else {
System.out.println("There is no /ws/");
}
它首先找到/ws/
,然后懒惰地匹配每个字符,直到找到字符串的结尾或/
。
您可以查看有关正则表达式的更详细说明,并测试更多字符串here。
编辑:
正如安迪·特纳(Andy Turner)所建议的,/ws/[^/]*
是您可以使用的另一个正则表达式,并且速度更快。它首先找到/ws/
,然后匹配0个或多个非/
字符,并尽可能匹配。
答案 1 :(得分:1)
如果您愿意,您可以在不使用正则表达式的情况下进行Sweeper's answer的等效操作:
int start = test1.indexOf("/ws/");
if (start >= 0) {
int end = test1.indexOf("/", start + "/ws/".length());
String found = end >= 0 ? test1.substring(start, end) : test1.substring(start);
// ...
}
这可能比基于正则表达式的方法要快,因为它不必编译正则表达式。当然,这是以增加冗长为代价的。
答案 2 :(得分:0)
您可以隔离索引,然后使用三元运算符,例如:
int idx1 = test1.indexOf("/ws");
int idx2 = test1.lastIndexOf("/");
String sub = test1.substring(idx1, idx2 > idx1 ? idx2 : test1.length());
答案 3 :(得分:0)
这是因为在第二个字符串lastIndexOf
/
中与/ws
相同,因此您可以使用简单的if
语句来实现,即如果它们相同则最后一个索引的长度应为String
String test1 = "https://31.191.110.125:443/App/ws/list/play";
String test2 = "https://31.191.110.125:443/App/ws/list";
int firstIndex = test2.indexOf("/ws");
int lastIndex = test2.lastIndexOf("/");
if(firstIndex == lastIndex){
lastIndex = test2.length();
}
String sub = test1.substring(firstIndex, lastIndex);
System.out.println("Substring: " + sub);