【问题标题】:How to use substring and indexOf for a String with repeating characters?如何将 substring 和 indexOf 用于具有重复字符的字符串?
【发布时间】:2013-05-21 18:53:29
【问题描述】:

我有以下String myString="city(Denver) AND state(Colorado)"; 它有重复的“(”和“)”......

如何检索州名,即科罗拉多州。我尝试了以下方法:

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

但它给了indexOutOfBoundException

有什么方法可以指定我需要 myString 中的第二个“(”? 我需要结果:String state = "Colorado";

【问题讨论】:

    标签: java string substring indexof


    【解决方案1】:

    使用lastIndexOf。还要增加初始偏移量以允许子字符串state(中的字符数:

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

    【讨论】:

    • 感谢它的工作!我可以问一下,以防我有这个"(" 重复多次,例如myString="abc(defg(h(i(k(o"。有什么方法可以指定我需要第三个"("?我可以使用:myString.thirdIndexOf("("))...可能不行吗?
    • 在这种情况下,您将使用indexOf(String, startIndex) 当然,您必须使用第三个位置(通过再次使用indexOf(String, startIndex) 从子字符串中获取索引。
    【解决方案2】:

    您可以使用正则表达式。

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

    【讨论】:

      【解决方案3】:

      你可以把字符串剪下来,然后在一个 sanboxed 中做。这样,如果后面有更多的“)”,就不会发生任何不好的事情

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

      【讨论】:

        【解决方案4】:

        您可以使用其他版本的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);
        

        【讨论】:

          【解决方案5】:

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

          如果您需要最后一个索引,您可以使用lastIndexOf(),用于"("")"。如果您恰好需要第二次出现,您可以使用 version of 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);
          

          【讨论】:

            猜你喜欢
            • 2021-01-09
            • 2020-03-13
            • 1970-01-01
            • 2020-09-13
            • 2015-03-03
            • 1970-01-01
            • 2021-12-02
            • 2016-06-09
            • 2021-04-29
            相关资源
            最近更新 更多