混淆了.split()在Java中的工作方式

混淆了.split()在Java中的工作方式,java,regex,string,split,Java,Regex,String,Split,我从一个文本文件中获取了这个字符串 "1 normal 1 [(o, 21) (o, 17) (t, 3)]" 我想在字符串数组中接受1,normal,1,o,21,17,t,3 Scanner inFile = new Scanner(new File("input.txt"); String input = inFile.nextLine(); String[] tokens = input.split(" |\\(|\\)|\\[\\(|\\, |\\]| \\("); fo

我从一个文本文件中获取了这个字符串

"1 normal 1 [(o, 21) (o, 17) (t, 3)]"
我想在字符串数组中接受
1,normal,1,o,21,17,t,3

Scanner inFile = new Scanner(new File("input.txt");
String input = inFile.nextLine();

String[] tokens = input.split(" |\\(|\\)|\\[\\(|\\, |\\]| \\(");
     for(int i =0 ; i<tokens.length; ++i)
     {
        System.out.println(tokens[i]);
     }
为什么阵列中存储空间。

例如:

1 [(o
  • 第一步,它匹配一个空格
  • 它匹配的下一步是
    [(

  • 因此,在这两个匹配之间,将返回一个空字符串“”。

    这不是空格,而是空字符串。您的字符串是:

    "1 normal 1 [(o, 21) (o, 17) (t, 3)]"
    
    它根据您的regexp按以下方式拆分:

    Token = "1"
    Delimiter = " "
    Token = "normal"
    Delimiter = " "
    Token = "1"
    Delimiter = " "
    Token = "" <-- empty string
    Delimiter = "[("
    Token = "o"
    ... end so on
    
    因此,任何数量的
    “()[,]”
    相邻字符都将被视为分隔符

    Token = "1"
    Delimiter = " "
    Token = "normal"
    Delimiter = " "
    Token = "1"
    Delimiter = " "
    Token = "" <-- empty string
    Delimiter = "[("
    Token = "o"
    ... end so on
    
    "[ \\(\\)\\[\\,\\]]+"