3

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

> R 120 Something AWord

> P 160 SomethingElse "A string literal"

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

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

4

1 回答 1

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);
于 2012-09-10T23:20:30.990 回答