Java Scanner - 除非存在引号,否则用空格分隔?
Posted
技术标签:
【中文标题】Java Scanner - 除非存在引号,否则用空格分隔?【英文标题】:Java Scanner - Delimit by spaces unless quotation marks are present? 【发布时间】:2012-09-03 20:25:47 【问题描述】:我正在尝试使用 Java 中的 Scanner 类从配置文件中获取数据。文件的元素由空格分隔。但是,如果应将短语或元素解释为字符串文字(包括空格),则在元素周围放置双引号或单引号。这给出了如下所示的文件:
> R 120 Something AWord
> P 160 SomethingElse "A string literal"
使用 Java Scanner 类时,默认情况下它仅由空格分隔。 Scanner 类具有 useDelimiter() 函数,该函数采用正则表达式为文本指定不同的分隔符。但是,我不擅长正则表达式,所以我不确定该怎么做。
我怎样才能用空格分隔,除非有引号包围的东西?
【问题讨论】:
【参考方案1】:您可以使用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 - 除非存在引号,否则用空格分隔?的主要内容,如果未能解决你的问题,请参考以下文章
除非另一个 div 存在,否则让 div 占据页面的 100%
除非当前场景中存在所有数据,否则如何防止转到另一个 Storyboard 场景?