【问题标题】:How do you keep scanner.next() from including newline?你如何让scanner.next() 不包含换行符?
【发布时间】:2016-04-16 20:55:52
【问题描述】:

我正在尝试使用带有分隔符等于“”的scanner.next() 来简单地读取文本文件中的单词,但扫描仪包含带有令牌的换行符/回车符。

我已经在互联网上搜索了这个问题的一个很好的例子,但没有找到,所以我把它贴在这里。我在 SO 上找不到另一个类似的问题。我还查看了有关扫描仪和模式 (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html) 的文档,但我仍然找不到解决此问题的方法。

文本文件:

这是一个测试

看看这个是否正常

好的!

代码:

int i = 0;
String string;
try(Scanner scanner = new Scanner(new File(filename))) {
    scanner.useDelimiter(" ");
    while(scanner.hasNext())
    {
    string = scanner.next();
    System.out.println(i++ + ": " + string);
    }
}catch(IOException io_error) {
    System.out.println(io_error);
    }

输出:

0:这个

1:是

2:一个

3:测试

4:见

5: 如果1

6:这个,

7: 是

8:工作

好的!

如您所见,#3 和#8 有两个单词,由换行符分隔。 (我知道我可以将它们分成两个单独的字符串。)

【问题讨论】:

    标签: java io newline delimiter


    【解决方案1】:

    documentation of Scanner 说:

    扫描器使用的默认空白分隔符被Character.isWhitespace识别

    链接的documentation of Character.isWhitespace 说:

    根据 Java 确定指定字符是否为空格。一个字符是一个 Java 空白字符当且仅当它满足以下条件之一:

    • 它是 Unicode 空格字符(SPACE_SEPARATOR、LINE_SEPARATOR 或 PARAGRAPH_SEPARATOR),但也不是不间断空格('\u00A0'、'\u2007'、'\u202F')。
    • 它是 '\t',U+0009 水平制表。
    • 它是'\n',U+000A LINE FEED。
    • 它是 '\u000B',U+000B 垂直制表。
    • 它是'\f',U+000C FORM FEED。
    • 是 '\r',U+000D 回车。
    • 它是 '\u001C',U+001C 文件分隔符。
    • 它是 '\u001D',U+001D 组分隔符。
    • 它是 '\u001E',U+001E 记录分隔符。
    • 它是 '\u001F',U+001F 单位分隔符。

    所以,不要设置任何特定的分隔符。保持默认,换行符会像空格一样被视为分隔符,这意味着令牌不会包含换行符。

    【讨论】:

    • 这太容易了!我想多了。谢谢!
    【解决方案2】:

    string = scanner.next(); 之后替换\n

    string = string.replace("\n", "");
    

    然后打印出字符串变量.. 这应该可以解决问题

    【讨论】:

    • 我添加了那行,但我得到了相同的输出。
    • @Samuel 阅读了 JB Nizet 的回答,他是对的,我现在看到您已将分隔符设置为“”,而不是将其设置为 \n
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多