2016-11-16 28 views
3

为什么Java String.split()在使用代码中定义的字符串时会生成不同的结果,而涉及到数字时会从文件中读取字符串?具体来说,我有一个名为包含由空格分隔的字符和数字“的test.txt”文件:使用字符串时,Java split()的结果会有所不同

G H 5 4 

分割方法并不如预期各执空间。但是,如果在代码中创建一个字符串变量,并使用空格分隔相同的字符和数字,则split()的结果是四个单独的字符串,一个用于char和number。下面的代码演示了这种差异:

import java.io.File; 
    import java.io.FileReader; 
    import java.io.BufferedReader; 

    public class SplitNumber { 

    //Read first line of text file 
    public static void main(String[] args) { 
     try { 
     File file = new File("test.txt"); 
     FileReader fr = new FileReader(file); 
     BufferedReader bufferedReader = new BufferedReader(fr); 

     String firstLine; 
     if ((firstLine = bufferedReader.readLine()) != null) { 
      String[] firstLineNumbers = firstLine.split("\\s+"); 
      System.out.println("First line array length: " + firstLineNumbers.length); 

      for (int i=0; i<firstLineNumbers.length; i++) { 
      System.out.println(firstLineNumbers[i]); 
      } 
     } 
     bufferedReader.close(); 

     String numberString = "G H 5 4"; 
     String[] numbers = numberString.split("\\s+"); 
     System.out.println("Numbers array length: " + numbers.length); 

     for (int i=0; i<numbers.length; i++) { 
      System.out.println(numbers[i]); 
     } 
     } catch(Exception exception) { 
     System.out.println("IOException occured"); 
     exception.printStackTrace(); 
     } 
    } 
    } 

结果是:

First line array length: 3 
G 
H 
5 4 
Numbers array length: 4 
G 
H 
5 
4 

为什么从文件中的数字没有得到解析一样在代码中定义的相同字符串?

+1

该文件的内容是什么? – Zarwan

+7

看起来文件中的最后一个空格不是空格 – njzk2

+1

找到一个十六进制编辑器并检查文件中的实际内容。 '\ s'只匹配'\ t \ n \ x0B \ f \ r',但还有一些其他的“似乎是空白”的字符 –

回答

1

根据反馈,我将正则表达式更改为split("[\\s\\h]+")解决了问题;该文件的编号被正确分割,这清楚地表明我在我使用的文本文件中有一个不同的空白字符。然后,我替换了文件的内容(使用记事本)并恢复为split("\\s+"),并发现这次它正常工作。所以在某些时候,我必须在文件中引入不同的空白字符(可能是复制/粘贴问题)。最后,带走我应该使用split("[\\s\\h]+")从我想分割空间的文件中读取,因为它将覆盖更多可能不会立即显而易见的场景。

感谢所有帮助我找到问题的根源。

+0

感谢您分享您的结论。这可能对其他人有帮助。 –

+0

我编辑了答案来解决正则表达式中无效的反斜杠转义问题。 – tpttpttpt

相关问题