【问题标题】:Using useDelimiter in Java在 Java 中使用 useDelimiter
【发布时间】:2019-04-26 20:15:31
【问题描述】:

我有一个包含日期连字符的文件。

例如:

阿贝 F 5-5-1996 0 0 0 0 约翰 M 5-5-1997 10 10 10 10

https://i.imgur.com/TmGMLUg.png“例子”

我遇到的问题是尝试打印将所有内容放在一行中。

我累了:

line.useDelimiter("[\t \r]");

line.useDelimiter("-"); //to remove the hypens.

Scanner input = new Scanner(new FileReader(filename)); 
while(input.hasNextLine()) { 
        Scanner line = new Scanner(input.nextLine()); 
        line.useDelimiter("[\t \r]"); // Tab (\t) and/or space ( ) and/or carriage return (\r) delimited file
        line.useDelimiter ("-");    
        lineno++;
        System.out.println("--------READING-LINE-" + lineno + "--------");
        while(line.hasNext()) 
            System.out.println(line.next());
        line.close();

待打印

阿贝 F 5 5 1996 0 0 0 0 --------READING-LINE-2-------- 约翰 米 5 5 1997 10 10 10 10

https://i.imgur.com/jByjipO.png“预期”

【问题讨论】:

  • 我正在尝试去掉连字符并打印所有内容。
  • 无论如何,现在我怀疑您可能正在寻找line.useDelimiter("[\t \r-]");,或者如果您决定在line.useDelimiter("[\t \r\\-]"); 之后添加更多字符,则可以更安全地使用它。让我知道这是否给出了您想要的结果以及您是否需要进一步解释。
  • "print everything in line" 通常表示在一行中打印 horizo​​ntal,但您的示例显示 vertical “预期”结果很少令人困惑。
  • 是的,我的意思是垂直。谢谢您的帮助。您提供的代码给了我想要的结果。进一步的解释会很好。

标签: java printing delimiter


【解决方案1】:

我假设您想在每个制表符、空格、行分隔符上进行拆分(可能不仅是 \r,还可能是 \n\r\n 序列)和连字符 -

您的方法的第一个问题是line.useDelimiter("-"); 替换了之前选择的分隔符line.useDelimiter("[\t \r]");

您需要提供结合这两种设置的 一个 分隔符。棘手的部分是[..] 内的连字符- 将是元字符,它不代表-,但表示范围。这是因为 Scanner 期望正则表达式(正则表达式)形成分隔符,但在正则表达式 character class[...] 事物)中允许用户提供 range 的字符,如 a-z(而不是写 @ 987654333@) 所以连字符- 在那里被视为特殊字符。

要使其字面化,我们需要将- 转义到[..] 中。为此,我们可以:

  • 在其前面放置\(在字符串文字中需要写为"\\"),
  • 或将其放置在可防止正则表达式引擎将其视为范围指示器的位置,例如
    • 在字符类的开头[-...]
    • 或在它的末尾[...-]

但更安全的选择是使用"\\-" 显式转义它,因为它可以让您安全地修改该正则表达式而不会有任何意外(例如,如果您有像[a-ek-] 这样的正则表达式,如果您想添加z,您会可能写[a-ek-z],但这不代表a-ek-z而是a-zk-z。如你所见,如果你有[a-ek-\]添加单个字母z因为定界符会导致正则表达式[a-ek\-z],这是我们之后所知道的)。

所以你可以使用line.useDelimiter("[\t \r\\-]");

OR 也可以处理其他行分隔符,例如 \n\r\n sequence 使用 \R(不能在字符类中使用,因为它不仅代表单个字符,而是还有\r\n 序列)。所以要使用它,我们需要使用|(OR 运算符),比如

line.useDelimiter("[\t \\-]|\\R");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多