【问题标题】:Result of Java split() is varies when working with string of numbersJava split() 的结果在处理数字字符串时会有所不同
【发布时间】:2016-11-16 04:07:33
【问题描述】:

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

G H 5 4

split 方法不会像预期的那样在空格上进行拆分。但是,如果在代码中创建了一个字符串变量,其相同的字符和数字由空格分隔,则 split() 的结果是四个单独的字符串,一个用于字符和数字。下面的代码演示了这种差异:

   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

为什么文件中的数字与代码中定义的相同字符串的解析不同?

【问题讨论】:

  • 文件的内容是什么?
  • 文件中的最后一个空格好像不是空格
  • 找到一个十六进制编辑器并检查文件中的实际内容。 \s 仅匹配 `\t\n\x0B\f\r` 但还有一些其他“似乎是空白”字符
  • 顺便说一句,一个格式正确的问题 - 做出了很好的改变
  • 只是一个想法,您可以尝试split("[\\s\\h]+") 甚至split("[\\s\\h\\v]+")。似乎它会包含更多类似空格的字符。有关更多信息,请参阅文档。

标签: java split


【解决方案1】:

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

感谢大家帮助我找到问题的根本原因。

【讨论】:

  • 感谢您分享您的结论。它可能对其他人有所帮助。
  • 我已经编辑了答案以解决正则表达式中反斜杠的无效转义问题。
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多