【问题标题】:Java Scanner questionJava 扫描程序问题
【发布时间】:2010-12-31 04:34:03
【问题描述】:

如何将扫描仪的分隔符设置为 ;还是换行?

我试过了: Scanner.useDelimiter(Pattern.compile("(\n)|;")); 但它不起作用。

【问题讨论】:

  • 发现bug,我必须使用(\r\n)|;。我正在解析这样的东西:string;number\r\n... 它没有像 100\r 这样的数字。

标签: java regex java.util.scanner


【解决方案1】:

作为一般规则,在模式中,您需要将\ 加倍。

所以,试试

Scanner.useDelimiter(Pattern.compile("(\\n)|;"));`

Scanner.useDelimiter(Pattern.compile("[\\n;]"));`

编辑:如果\r\n 是问题所在,您可能想试试这个:

Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+"));

匹配\r\n; 中的一项或多项。

注意:这些我没试过。

【讨论】:

  • 你可以选择任何一种方式。如果您使用两个反斜杠,正则表达式编译器会看到 \n 并将其解释为换行符的转义序列。如果您使用一个反斜杠,正则表达式编译器会看到一个实际的换行符,它会按字面意思匹配。但我肯定会选择字符级版本:"[\\n;]""[\n;]";它更容易阅读,也更高效。
  • @Alan Moore:啊,好吧...我只是假设文字换行符会被误解。
【解决方案2】:

正如您所发现的,您需要查找 DOS/网络​​样式 \r\n (CRLF) 行分隔符,而不是 Unix 样式 \n(仅限 LF)。但是,如果文本同时包含两者呢?这种情况经常发生;事实上,当我查看这个页面的源代码时,我看到了这两种情况。

您应该养成寻找这两种分隔符的习惯,以及旧的 Mac 风格 \r(仅限 CR)。这是一种方法:

\r?\n|\r

将其插入到您获得的示例代码中:

scanner.useDelimiter(";|\r?\n|\r");

这是假设您希望一次只匹配一个换行符或分号。如果你想匹配一个或更多,你可以这样做:

scanner.useDelimiter("[;\r\n]+");

也请注意,我是如何传入正则表达式 string 而不是 Pattern;所有正则表达式都会自动缓存,因此预编译正则表达式不会为您带来任何性能提升。

【讨论】:

    【解决方案3】:

    查看 OP 的评论,问题似乎是不同的行尾(\r\n 或 CRLF)。

    这是我的答案,它将以任何一种格式处理多个分号和行尾(可能需要也可能不需要)

    Scanner.useDelimiter(Pattern.compile("([\n;]|(\r\n))+"));
    

    例如如下所示的输入文件:

    1
    
    
    2;3;;4
    5
    

    将导致 1,2,3,4,5

    我尝试了正常的 \n 和 \\n - 两者都适用于我的情况,但我同意如果你需要一个正常的反斜杠,你会想要加倍它,因为它是一个转义字符。碰巧在这种情况下,“\n”成为所需的字符,有或没有额外的'\'

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      相关资源
      最近更新 更多