【问题标题】:Java Scanner to split records by an empty lineJava Scanner 按空行拆分记录
【发布时间】:2012-04-18 17:36:56
【问题描述】:

我的记录格式如下:

记录 1 行
记录 1 行
记录 1 行

记录 2 行
记录 2 行
记录 2 行

...

我想使用 java Scanner 来提取每条记录的行。但是,我的模式似乎无法正常工作。

new Scanner(reader).useDelimiter(Pattern.compile("^\\s*$"));

我取回我的输入,而不是scanner.next() 给我每条记录的行。

【问题讨论】:

  • 我的解决方案:new Scanner(reader).useDelimiter(Pattern.compile("^\\s*$", Pattern.MULTILINE));我没有设置MULTILINE标志,看文档的时候看不清楚。
  • @Bart 它实际上产生的输出略有不同它将产生:record 1 line record 1 line record 1 line 第一次调用 next 和 record 2 line record 2 line record 2 line 第二次调用。

标签: java regex java.util.scanner


【解决方案1】:

我想出的解决方案是这样的:
new Scanner(reader).useDelimiter(Pattern.compile("^\\s*$", Pattern.MULTILINE));

这会将记录行作为一个组返回:
scanner.next()
产量:
record 1 line 1
record 1 line 2
record 1 line 3

再做一次scanner.next()
产量:
record 2 line 1
record 2 line 2
record 2 line 3

如果您只需要单独的线条,请使用 @bart 的解决方案。

【讨论】:

    【解决方案2】:

    如果你想要多行,我会尝试

    "\\n\\n+"
    

    【讨论】:

      【解决方案3】:

      这有点猜测,但你真的需要在这里使用正则表达式吗?我认为您只需将分隔符设置为换行符即可。

      【讨论】:

        【解决方案4】:

        我会这样做的。

        StringBuilder sb = new StringBuilder();
        ArrayList<String> records = new ArrayList<String>();
        while(scanner.hasNextLine()){
            String line = scanner.nextLine();
            if("".equals(line.trim())){
                records.add(sb.toString());
                sb = new StringBuilder();
            }else{
                sb.append(line);
                sb.append("\n");
            }
        }
        System.out.println(records);
        

        我没有对此进行测试,因此可能会出现一些愚蠢的错误。

        【讨论】:

          猜你喜欢
          • 2014-01-25
          • 2019-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多