10

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

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

4

3 回答 3

16

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

所以,试试

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

或者

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

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

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

\r与、\n和中的一个或多个匹配;

注意:我没有尝试过这些。

于 2009-12-30T17:59:06.257 回答
9

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

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

\r?\n|\r

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

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

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

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

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

于 2009-12-30T19:55:12.793 回答
1

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

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

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

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

1


2;3;;4
5

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

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

于 2009-12-30T18:29:08.407 回答