如何在包含重复字符的字符串中使用substring和indexOf函数?

4
我有以下的字符串:String myString="city(Denver) AND state(Colorado)"; 它有重复的"("和")"...
我该如何获取州名,即Colorado。我尝试了以下方法:
String state = myString.substring(myString.indexOf("state(")+1,myString.indexOf(")"));

但它会抛出“indexOutOfBoundException”异常。
有没有办法指定我需要myString中的第二个“(”? 我需要得到结果:String state = "Colorado";
5个回答

9
使用lastIndexOf。同时增加初始偏移量,以允许子字符串state(中的字符数:
String state = myString.substring(myString.indexOf("state(") + 6, myString.lastIndexOf(")"));

谢谢,它有效!我可以问一下,如果我有多个 "(" 重复出现,例如 myString="abc(defg(h(i(k(o"。是否有办法指定我需要第三个 "("?我可以使用:myString.thirdIndexOf("("))... 可能不行吗? - Buras
在这种情况下,您将使用indexOf(String, startIndex)。当然,您必须通过再次使用indexOf(String, startIndex)从子字符串获取索引来确定第三个左括号的位置。 - Reimeus

5

您可以使用正则表达式(Regex)。

Matcher matcher = Pattern.compile("(state)(\(.*?\))").matcher(text);
String state = matcher.group(2);

2

您可以将字符串截短,并在受限制的代码块中执行。这样,如果有更多的括号“)”没有关联,也不会发生任何错误。

String state = myString.substring(myString.indexOf("state(")+6);
state = state.substring(0,state.indexOf(")"));

1
您可以使用其他版本的 String#indexOf(String str, int fromIndex) 来指定您希望从哪个位置开始搜索 ")"
int start = myString.indexOf("state(")+6;//6 is the length of "state(" - we dont want that part
int end = myString.indexOf(")", start);
String state = myString.substring(start, end);

1

你的问题是第一个 ")" 出现在 "state(" 之前,因为它也出现在 Denver 之后。

如果你需要最后一个索引,可以使用 lastIndexOf(),同时搜索 "("")"。如果你需要精确查找第二个出现的位置,可以使用 indexOf() 的版本,允许你指定开始搜索的索引,并将该索引设置为第一个字符出现后的位置,像这样:

 int firstOpenP = myString.indexOf("(");
 int firstClosedP = myString.indexOf(")");
 int secondOpenP = myString.indexOf("(", firstOpenP + 1);
 int secondClosedP = myString.indexOf(")", firstClosedP + 1);
 String state = myString.substring(secondOpenP + 1, secondClosedP);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接