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