Java Substring条件结束

时间:2019-04-26 07:04:56

标签: java string substring

我有一个字符串,例如:

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字符串执行此操作?

4 个答案:

答案 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);