Java Scanner - 除非存在引号,否则用空格分隔?

标签 java regex java.util.scanner

我正在尝试使用 Java 中的 Scanner 类从配置文件中获取数据。文件的元素由空格分隔。但是,如果短语或元素应被解释为字符串文字(包括空格),则双引号或单引号会放在元素周围。这会生成如下所示的文件:

> R 120 Something AWord

> P 160 SomethingElse "A string literal"

当使用 Java Scanner 类时,默认情况下它仅以空格分隔。 Scanner 类具有 useDelimiter() 函数,该函数采用正则表达式为文本指定不同的分隔符。但是,我不擅长正则表达式,所以我不确定该怎么做。

除非周围有引号,否则如何用空格分隔?

最佳答案

您可以使用 scanner.findInLine(pattern)方法来指定您要防止字符串文字被拆分。您只需要一个正则表达式来匹配无引号标记或引号中的标记。这个可能有用:

"[^\"\\s]+|\"(\\\\.|[^\\\\\"])*\""

(该正则表达式非常复杂,因为它处理字符串文字内的转义。)

例子:

String rx = "[^\"\\s]+|\"(\\\\.|[^\\\\\"])*\"";
Scanner scanner = new Scanner("P 160 SomethingElse \"A string literal\" end");
System.out.println(scanner.findInLine(rx)); // => P
System.out.println(scanner.findInLine(rx)); // => 160
System.out.println(scanner.findInLine(rx)); // => SomethingElse
System.out.println(scanner.findInLine(rx)); // => "A string literal"
System.out.println(scanner.findInLine(rx)); // => end

findInLine 方法,顾名思义,只在当前行内起作用。如果你想搜索整个输入,你可以使用 findWithinHorizon反而。您可以将 0 作为地平线传入,以告诉它使用无限地平线:

scanner.findWithinHorizon(rx, 0);

关于Java Scanner - 除非存在引号,否则用空格分隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12360694/

相关文章:

java - String.replaceAll() 替换所有字符而不仅仅是正则表达式。 - java

java - java中的列表差异

php - 在php中匹配来自mysql的电话号码

mysql - 请使用正确的正则表达式语法提供建议

Java Scanner 不会 "finish"读取输入

java - 如何在一种方法上使用两台扫描仪

java - 获取@Scheduled内的fixedDelay值

java - 面向公众的安全 API

java - 读取 EOF 后使用 Scanner 类读取 Standard.In 时出现 NoSuchElementException

regex - 狂欢 : extracting date from file