我有一个包含日期连字符的文件。
例如:
Abey F 5-5-1996 0 0 0 0 John M 5-5-1997 10 10 10 10
/image/Jfna5.png "example"
The problem I am having is trying to print put everything in one line.
I have tired:
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
/image/1IZlM.png “预期”
最佳答案
我假设您想要在每个制表符、空格、行分隔符上进行拆分(可能不仅是 \r
,还包括 \n
或 \r\n
序列)和连字符 -
。
您的方法的第一个问题是 line.useDelimiter("-");
替换了之前选择的分隔符 line.useDelimiter("[\t\r ]");
。
您需要提供一个结合这两种设置的分隔符。棘手的部分是 [..]
内的连字符 -
将是元字符,它不会代表 -
但指示范围。这是因为Scanner期望regex(正则表达式)构成分隔符,但在regex character class中([...]
事物)允许用户提供 范围 字符,如 a-z
(而不是编写 [abcde.. .z]
),因此连字符 -
被视为特殊字符。
为了使其成为字面,我们需要在[..]
内转义-
它。为此,我们可以:
- 在其前面放置
\
(在字符串文字中需要写为"\\"
), - 或者将其放置在可以防止正则表达式引擎将其视为范围指示器的位置,例如
- 在字符类的开头
[-...]
- 或在其末尾
[...-]
。
- 在字符类的开头
但更安全的选择是使用 "\\-"
显式转义它,因为它允许您安全地修改该正则表达式而不会出现任何意外(例如,如果您有像 [a -ek-]
,如果你想添加 z
你可能会写 [a-ek-z]
但这不会代表 a-e
或k
或-
或z
但a-z
或k-z
。如您所见,如果您 [a-ek-\]
添加单个字母 z
作为分隔符,将导致正则表达式 [a-ek\-z]
这就是我们所追求的)。
所以你可以使用 line.useDelimiter("[\t\r\\-]");
或者还可以处理其他行分隔符,例如 \n
或 \r\n
sequence 使用 \R
(不能在字符类内部使用,因为它不仅表示单个字符,还表示 \r\n
序列)。因此,要使用它,我们需要使用 |
(OR 运算符),例如
line.useDelimiter("[\t\\-]|\\R");
关于java - 在 Java 中使用 useDelimiter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55874419/