2014-10-28 49 views
2

我写了一个用于解析模板的扫描程序实用程序。
考虑代码片段:扫描仪hasNext(字符串模式)错误地返回true

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?
任何帮助,将不胜感激。

回答

1

因为hasNext

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

空行不包含任何标记,因此从第4行

+0

寻找下一个标记与在文档的hasNext(模式)改为:“如果下一个完整标记与指定模式匹配,则返回true。一个完整的标记是由匹配分隔符模式的输入前缀和后缀。“我的分隔符是新行char,因此这里的完整标记应该是“”,即空行。我错了吗? – Pratham 2014-10-28 13:27:50

+0

有一点,它们所指的分隔符模式是'\\ s'空格。 'hasNext'不知道你的模式。 – weston 2014-10-28 13:59:51

+0

在我的代码中,我将分隔符更改为新行scanner.useDelimiter(System.getProperty(“line.separator”))。 hasNext以完整的令牌运行。同样如文档“分隔模式”中所述\“可以返回空的标记,因为它一次只传递一个空格。”因此我假定它会返回hasNext将运行的空标记。正确吗? – Pratham 2014-10-28 14:04:55