Java - substring存储到单独的字符串变量中

时间:2016-04-08 16:10:55

标签: java arrays string for-loop

所以我有一个类似下面的字符串

"1: Command(1, 2, 3)"

我最终希望将1 2 3存储到String个变量中。我怎么能做到这一点?

以下是一段代码,它读取字符串数组并尝试打印出该字符串的参数。

for (int i = 0; i < TableElements.length; i++) {
  if (sadTableElements[i] != null) {
    System.out.println("DEBUG " + sadTableElements[i]);
    Param0 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf("(") + 1, 
                              TableElements[i].indexOf(",")));
    System.out.println(Param0);

    Param1 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, 
                              TableElements[i].indexOf(",")));
    System.out.println(Param1);

    Param2 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, 
                              TableElements[i].indexOf(")")));
    System.out.println(Param2);
  }
}

我得到了这个输出:

  

DEBUG 1:命令(1,2,3)1线程“AWT-EventQueue-0”中的异常   java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:   -2

似乎停在System.out.println(Param1);

4 个答案:

答案 0 :(得分:1)

 Param1 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, TableElements[i].indexOf(",")));

TableElements[i].indexOf(",")为您提供第一个,字符的索引,该字符低于从TableElements[i].indexOf(",") + 2获得的索引。这就是你得到例外的原因。

答案 1 :(得分:1)

也许最好使用regexp:

java.util.regex.Matcher m = java.util.regex.Pattern.compile("^\\d+: Command\\((\\d+), (\\d+), (\\d+)\\)").matcher("1: Command(1, 2, 3)");
if (!m.matches()) {
    throw new AssertionError("Your Regex Pattern or Input is bad");
}
System.out.println(m.group(1) + " | " + m.group(2) + " | " + m.group(3));

这里的输出是:1 | 2 | 3

注意:如果您对其进行了调整,请重新使用已编译的模式,不要为每个输入字符串重新编译它

答案 2 :(得分:1)

 Param1 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, TableElements[i].indexOf(",")));

indexOf(...)都指向完全相同的冒号。所以你要构建一个从索引+ 2到索引的子字符串。您可以使用split(...)函数或将创建的子字符串保存在新字符串中。

答案 3 :(得分:1)

Java中的

indexOf()函数返回匹配子字符串的第一个索引 indexOf(&#34;,&#34;)将始终返回第一个&#34;,&#34;的索引。它在整个输入字符串中找到。

即。 indexOf(&#34;,&#34;)将始终返回第一个&#34;,&#34;的索引。在输入字符串中找到。要获取Param1和Param2,请尝试使用以下代码:

    Param0 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf("(") + 1, TableElements[i].indexOf(",")));
    System.out.println(Param0);
    Param1 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, TableElements[i].lastIndexOf(",")));
    System.out.println(Param1);
    Param2 = Integer.parseInt(TableElements[i].substring(TableElements[i].lastIndexOf(",") + 2, TableElements[i].indexOf(")")));
    System.out.println(Param2);

lastIndexOf()函数返回可能匹配的最后一个索引,即它将返回第二个匹配的索引&#34;,&#34;哪个应该给出正确的输出。

希望有所帮助!