【问题标题】:Scanner hasNext(String pattern) falsely returns true扫描器 hasNext(String pattern) 错误地返回 true
【发布时间】:2014-12-23 21:28:54
【问题描述】:

我编写了一个用于解析模板的扫描仪实用程序。
考虑代码 sn-p :

String input = FileUtils.readFileToString(new File("input file path"));

Scanner scanner = new Scanner(input);
scanner.useDelimiter(System.getProperty("line.separator"));

System.out.println("Checking");
while(scanner.hasNext())
{
    System.out.print(scanner.hasNext("\\s*#[^\\n]*"));
    System.out.println(" : " + scanner.nextLine());
}

输入文件内容:

# Line 1
#######################

# Check
 # Matched with spaces
     #


// End of file

注意:输入中不存在文件行的结尾。

产生的输出:

Checking
true : # Line 1
true : #######################
true : 
true : # Check
true :  # Matched with spaces
true :       #
false :      
false :      

我的问题是,为什么第三行 hasNext() 不以 '#' 开头也会返回 true ?
任何帮助将不胜感激。

【问题讨论】:

    标签: java regex java.util.scanner


    【解决方案1】:

    因为hasNext

    如果下一个标记与从指定字符串构造的模式匹配,则返回 true。

    空白行不包含标记,因此它正在从第 4 行查找下一个标记。

    【讨论】:

    • 在 hasNext(Pattern) 的文档中读到:“如果下一个完整标记与指定模式匹配,则返回 true。完整标记由与分隔符模式匹配的输入作为前缀和后缀。”我的分隔符是换行符,因此这里的完整标记应该是“”,即空行。我错了吗?
    • 一点,他们指的分隔符模式是\\s空格。 hasNext 不知道你的模式。
    • 在我的代码中,我将分隔符更改为新行scanner.useDelimiter(System.getProperty("line.separator"))。 hasNext 对一个完整的令牌进行操作。同样如文档中所述,“分隔模式“\\s”可能返回空标记,因为它一次只传递一个空格。”。因此,我假设它将返回 hasNext 将在其上运行的空令牌。正确吗?
    • 我明白了,也许你应该 scanner.useDelimiter("\\n") 因为它期待一个正则表达式。或scanner.useDelimiter(Pattern.Quote(System.getProperty("line.separator")));
    • 正确的正则表达式是"\\\r?\\\n" 反斜杠是java中的特殊字符,在正则表达式语法中,需要双转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    相关资源
    最近更新 更多