我有一个带有连字符的日期文件。
例如:
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
答案 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-e
或k
而是-
或{ {1}},如您所见,如果您z
添加单个字母a-z
作为定界符,将导致正则表达式k-z
,这是我们要注意的事项)。
因此您可以使用[a-ek-\]
OR还可以处理其他行分隔符,例如z
或[a-ek\-z]
序列使用line.useDelimiter("[\t \r\\-]");
(不能在字符类中使用,因为它不能在字符类中使用) t仅表示单个字符,还表示\n
序列)。因此,要使用它,我们需要使用\r\n
(或运算符)
\R