我正在尝试使用Java中的Scanner类从配置文件中获取数据。文件的元素由空格分隔。但是,如果短语或元素应解释为字符串文字(包括空格),则双引号或单引号是元素周围的位置。这给出了如下所示的文件:
> R 120 Something AWord
> P 160 SomethingElse "A string literal"
使用Java Scanner类时,默认情况下它只用空格分隔。 Scanner类具有useDelimiter()函数,该函数使用正则表达式为文本指定不同的分隔符。然而,我对正则表达式并不擅长,所以我不确定我是怎么做的。
我怎么能用空格分隔,除非有引号围绕什么?
答案 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);