Java Scanner问题

Raz*_*zvi 10 java regex java.util.scanner

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

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

Pow*_*ord 16

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

所以,试试吧

Scanner.useDelimiter(Pattern.compile("(\\n)|;"));`
Run Code Online (Sandbox Code Playgroud)

要么

Scanner.useDelimiter(Pattern.compile("[\\n;]"));`
Run Code Online (Sandbox Code Playgroud)

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

Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+"));
Run Code Online (Sandbox Code Playgroud)

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

注意:我没试过这些.


Ala*_*ore 9

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

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

\r?\n|\r
Run Code Online (Sandbox Code Playgroud)

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

scanner.useDelimiter(";|\r?\n|\r");
Run Code Online (Sandbox Code Playgroud)

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

scanner.useDelimiter("[;\r\n]+");
Run Code Online (Sandbox Code Playgroud)

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