【问题标题】:Java - Split String using regex and new lineJava - 使用正则表达式和新行拆分字符串
【发布时间】:2016-06-30 12:05:30
【问题描述】:

我有一个文件,我将其扫描到我的程序中并使用此代码存储在字符串中:

    try {
        data= new Scanner(new File("file.csv")).useDelimiter("\\Z").next();
    } catch (FileNotFoundException e) {
        System.out.println("File not found");
    }

file.csv 看起来像这样:

"RowA";"RowB"
55;56
57;58
59;60
61;62

现在,我正在尝试提取每个数字并将它们放入 String[] 中,如下所示:

    String[] number= data.split(";|\\r?\\n|\"|[a-zA-Z]");

当我像这样打印代码时:

    for(int i = 0; i < number.length; i++){
        System.out.println("Line: " + number[i]);
    }

我得到以下输出:

Line: 
Line:  
Line:  
Line:  
Line:  
Line:  
Line: 
Line: 
Line: 
Line: 
Line: 
Line: 
Line: 
Line: 
Line: 55
Line: 56
Line: 57
Line: 58
Line: 59
Line: 60
Line: 61
Line: 62

为什么数组中的第一个索引是空白的,如何删除它?

谢谢。

【问题讨论】:

  • 为什么不逐行读取并使用“;”分割字符串?

标签: java regex split delimiter


【解决方案1】:

在这个正则表达式中:

;|\r?\n|"|[a-zA-Z]
  • " 匹配字符串中的双引号 ("RowA";"RowB")
  • [a-zA-Z] 匹配 "RowA";"RowB" 中的每个字符。

因此它在所有这些地方都是分开的,你会得到空白。

如果您不需要这些部分,您可以删除它们,使用:

String[] number= data.split(";|\\r?\\n");

我还可以看到,您只需要数据中的数字,而不是 " 和字符。在这种情况下,您可以在拆分之前使用 replaceAll() 替换 " 和字符。

data.replaceAll("\"|[a-zA-Z]",""); 

【讨论】:

  • 这很好用。谢谢你,先生!但是,我已将每一行解析为它自己的 int[] 但它在每个数字之间显示 0(零):55、0、57、0、59、0 等等。我猜这与正则表达式,它正在将空格或其他内容解析为零。有什么想法吗?
  • 我发现了我的错误。它在我的 for 循环中,与您的答案无关。再次感谢您。
【解决方案2】:

如果您确定要为每组连续数字添加一个元素,那么快速简便的解决方案是:

String[] number= data.split("([^0-9])+");

只要您期望的每个值都是整数(无小数分隔符)并且其他任何地方都没有数字,这将提供您预期的输出。

编辑: 如果 data 的第一个/最后一个字符不是数字,它将在 number 数组的开始/结束处添加 一个 空项。

【讨论】:

    【解决方案3】:

    有关您的正则表达式的解决方案,请参阅@Hackerdarshi 的答案。

    但是,我提出了一种替代方法,它可能更有效地解析数字。

    您可以改为逐行读取文件,在";" 上拆分每一行,然后解析拆分返回的每个数字,而不是将整个文件读入字符串然后使用正则表达式解析数字:

    List<Integer> numbers = new ArrayList<>();
    
    File file = new File("file.csv");
    
    try (FileReader fileReader = new FileReader(file);
         BufferedReader bufferedReader = new BufferedReader(fileReader)){
        bufferedReader.readLine();    
    
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            for (final String number : line.split(";")) {
                numbers.add(Integer.parseInt(number));
            }
        }
    } catch(final IOException e) {
        e.printStackTrace();
    }
    

    【讨论】:

    • 你真的认为你的方法可能比正则表达式更有效吗?为什么?
    • @JordiCastilla 是的,等一下
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多