2014-10-28 2 views
2

템플릿을 구문 분석하기위한 스캐너 유틸리티를 작성했습니다.
는 코드를 고려하십시오스캐너 hasNext (문자열 패턴)가 거짓을 반환합니다.

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를 돌려줍니다 :

빈 줄은 hasNext (패턴)에 대한 문서에서 읽으면서이 라인 4.

+0

에서 다음 토큰을 찾는되도록 더 토큰을 포함하지 않는다. 완전한 토큰은 접두사이며 구분 기호 패턴과 일치하는 입력으로 접미사가 붙습니다. " 내 구분 기호는 개행 문자이므로 ""여기서 완전한 토큰은 빈 줄 ""이어야합니다. 내가 틀렸어? – Pratham

+0

약간, 그들이 참조하는 구분 기호 패턴은 공백 문자'\\ s '입니다. 'hasNext'는 당신의 패턴을 모른다. – weston

+0

내 코드에서 구분 기호를 새 줄 scanner.useDelimiter (System.getProperty ("line.separator"))로 변경했습니다. hasNext는 완전한 토큰에서 작동합니다. 또한 문서에 명시된 바와 같이 "구분 패턴"\\ s "한 번에 한 공간 만 통과하므로 빈 토큰을 반환 할 수 있습니다.". 따라서 hasNext가 작동 할 빈 토큰을 반환한다고 가정합니다. 맞습니까? – Pratham

관련 문제