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

时间:2012-09-10 23:13:57

标签: java regex java.util.scanner

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

> R 120 Something AWord

> P 160 SomethingElse "A string literal"

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

我怎么能用空格分隔,除非有引号围绕什么?

1 个答案:

答案 0 :(得分:5)

您可以使用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);