Java Scanner问题

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

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

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

所以,试试吧

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

要么

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

编辑 :如果\r\n是问题,您可能想尝试这样:

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

它匹配\r\n ,和中的一个或多个;

注意 :我没试过这些。

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

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

 \r?\n|\r 

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

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

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

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

另请注意,我是如何传入正则表达式字符串而不是模式的; 所有正则表达式都会自动缓存,因此预编译正则表达式不会获得任何性能提升。

看一下OP的评论,看起来它是一个不同的行结尾(\ r \ n或CRLF)就是问题所在。

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

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

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

 1 2;3;;4 5 

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

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