在Java中使用useDelimiter

时间:2019-04-26 20:15:32

标签: java printing delimiter

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

例如:

Abey    F   5-5-1996    0   0   0   0
John    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();

要打印

Abey
F
5
5
1996
0
0
0
0
--------READING-LINE-2--------
John
M
5
5
1997
10
10
10
10

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

1 个答案:

答案 0 :(得分:0)

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

您的方法遇到的第一个问题是line.useDelimiter("-"); 已替换先前选择的定界符line.useDelimiter("[\t \r]");

您需要提供一个将两个设置结合在一起的定界符。棘手的是,-中的连字符[..]将是元字符,它不代表-,而是表示 range 。这是因为Scanner希望正则表达式(正则表达式)形成定界符,但在正则表达式character class[...]中)允许用户提供{{1}之类的字符的 range }(而不是写a-z),因此连字符[abcde...z]被视为特殊字符。

要使其成为 literal ,我们需要将其-逸出-中。为此,我们可以:

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

但是更安全的选择是使用[...-]对其进行显式转义,因为它可以让您安全地修改该正则表达式而不会引起任何意外(例如,如果您拥有"\\-"之类的正则表达式,则想添加{ {1}}您可能会写[a-ek-],但不代表z[a-ek-z]a-ek而是-或{ {1}},如您所见,如果您z添加单个字母a-z作为定界符,将导致正则表达式k-z,这是我们要注意的事项)。

因此您可以使用[a-ek-\]

OR还可以处理其他行分隔符,例如z[a-ek\-z] 序列使用line.useDelimiter("[\t \r\\-]");(不能在字符类中使用,因为它不能在字符类中使用) t仅表示单个字符,还表示\n序列)。因此,要使用它,我们需要使用\r\n(或运算符)

\R