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 应用程序的 Windows 可执行文件