Java 扫描程序问题

Posted

技术标签:

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

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

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

【问题讨论】:

发现bug,我必须使用(\r\n)|;。我正在解析这样的东西:string;number\r\n... 它没有像 100\r 这样的数字。 【参考方案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”成为所需的字符,有或没有额外的'\'

【讨论】:

以上是关于Java 扫描程序问题的主要内容,如果未能解决你的问题,请参考以下文章

Java webapp中的病毒扫描?

用于运行被防病毒扫描程序删除的 Java 应用程序的 Windows 可执行文件

JAVA +扫描文档[关闭]

Freddy:一款基于活动被动扫描方式的Java&.NET应用程序漏洞扫描工具

从没有小程序的网页访问客户端的扫描仪

扫描图像后自动裁剪