带空格输入的IndexOf结果不同。

4

在获取两个分隔符之间的所有字符串时,我遇到了一些小问题。根据我在其他相关问题中看到的,(其中之一)获取两个分隔符之间的字符的方法如下: 给定一些字符串,在我的例子中是"void foo(int a, int b) {",我想获取括号内的每个字符。 使用:

String parameters = currLine.trim().substring(currLine.indexOf("("),
                    currLine.indexOf(")")-1);

这里的currLine当然是"void foo(int a, int b) {"。 现在一切都运行得很完美,因为我可以获得"int a, int b"这样的字符串。 问题是,如果是像下面这样的字符串:

    void                    foo                   (    int a      ,      String      b              )               {                 

我知道:

parameters = "nt a , String b ) "

但我不知道如何解决这个问题,而不会对第一个案例造成问题。


5
你已经把文本修剪了,但是你计算的是未修剪的文本中括号的索引,所以你的索引是错误的。最好在最后简单地修剪结果,不要提前修剪。 - jarmod
1
字符串是不可变的。trim()方法不会修改原始字符串,而是创建一个新的字符串(因此currLine仍然保留原始未修剪的字符串,并且您收到的索引也基于它)。另外,我不确定您在这里尝试实现什么目的。请考虑在问题中澄清其目的。 - Pshemo
1
当你在玩弄字符串解析时,你可能想要检查正则表达式。一旦你掌握了它,你就会离不开它! - Matthieu
1
是的@MM1,但问题出现在计算indexOf时,您在原始的String上执行该操作而不是修剪后的字符串。 - jccampanero
1
是的,没错 @MM1 - jccampanero
显示剩余4条评论
2个回答

4
问题在于trim并不修改原始的String。因此,当你计算substring时,根据输入的String是否在开头或结尾有空格,得到的结果会有所不同,因为indexOf是在原始的String上操作。

一个可能的解决方案如下:

// Trim the value
String trimmed = currLine.trim();
// And operate with it
String parameters = trimmed.substring(trimmed.indexOf("("),
                    trimmed.indexOf(")")-1);

一种更好的方法是对提供的值计算一个正则表达式,以提取括号中的信息,类似于:
Matcher m = Pattern.compile("\\((.*?)\\)").matcher(currLine);
if (m.find()) {
  String parameters = m.group(1);
  // Operate with parameters
}

2
应该如下所示:

它应该是这样的:

String parameters = currLine.substring(currLine.indexOf("(") + 1, currLine.indexOf(")")).trim();

演示:

public class Main {
    public static void main(String[] args) {
        String currLine = "void                    foo                   (    int a      ,      String      b              )               {                 ";
        String parameters = currLine.substring(currLine.indexOf("(") + 1, currLine.indexOf(")")).trim();
        System.out.println(parameters);
    }
}

输出:

int a      ,      String      b

请注意,String#substring(int beginIndex, int endIndex) 方法返回从指定的 beginIndex 开始的子字符串,并延伸到索引为 endIndex - 1 的字符。

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