Java Scanner问题

时间:2009-12-30 17:55:30

标签: java regex java.util.scanner

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

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

3 个答案:

答案 0 :(得分:16)

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

所以,试试

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

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

修改 :如果\r\n出现问题,您可能需要尝试此操作:

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

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

注意:我没试过这些。

答案 1 :(得分:9)

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

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

\r?\n|\r

将其插入到示例代码中:

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

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

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

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

答案 2 :(得分:1)

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

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

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

e.g。一个如下所示的输入文件:

1


2;3;;4
5

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

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