【问题标题】:Java Scanner - Delimit by spaces unless quotation marks are present?Java Scanner - 除非存在引号,否则用空格分隔?
【发布时间】:2012-09-03 20:25:47
【问题描述】:

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

> R 120 Something AWord

> P 160 SomethingElse "A string literal"

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

我怎样才能用空格分隔,除非有引号包围的东西?

【问题讨论】:

    标签: java regex java.util.scanner


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 2011-05-08
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多