我正在尝试使用 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/