2014-10-28 70 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