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 场景?

java读取TXT文件 我把10万个数字存在了TXT文件中以空格分隔 我想读出来该怎么办(用java )

除非调整窗口大小,否则组件不会显示 - Java

除非鼠标移动,否则 Java 物理循环(按间隔重绘)不稳定