2013-03-19 3 views
2

다음 코드가 false를 반환하는 이유는 무엇입니까?정규식 구분 기호가있는 Java 스캐너

Scanner sc = new Scanner("-v "); 
sc.useDelimiter("-[a-zA-Z]\\s+"); 
System.out.println(sc.hasNext()); 

괴상한 것은 -[a-zA-Z]//s+이 true를 반환합니다.

이가 true를 돌려주는 이유도 이해할 수 없다 :

Scanner sc = new Scanner(" -v"); 
sc.useDelimiter("-[a-zA-Z]\\s+"); 
System.out.println(sc.hasNext()); 

답변

5

스캐너는 토큰에 캐릭터 라인을 파괴하는 데 사용됩니다. 구분 기호는 토큰 사이에 구분 기호 인 입니다. 구분 기호는 과 일치하지 않습니다. 그들은 버려졌습니다. 스캐너에 -[a-zA-Z]\\s+이 구분 기호이며 -v이 정규식과 일치하므로 스캐너가 건너 뜁니다.

정규식과 일치하는 문자열을 찾으려면 String.matches()을 사용하십시오.

실제로 문자열을 토큰으로 분할하는 경우 String.split()을 사용하는 것이 더 편리 할 때도 있습니다.

+0

구분 기호로'- [a-zA-Z] \\ s +'를 사용하려고합니다. -v는 입력입니다. – Sawyer

1

감사합니다. 존 쿠겔 만, 당신이 옳다고 생각합니다.

스캐너는 사용자 정의 된 구분 기호를 사용하여 입력을 토큰으로 분할 할 수 있습니다. 기본 구분 기호는 공백입니다.

구분 기호가 모든 입력과 일치하지 않는 경우가 발생할 수 있습니다 하나의 토큰으로 모든 입력 : 구분 기호가 실제로 일치하지 않습니다 위의 코드에서

Scanner sc = new Scanner("-v"); 
    sc.useDelimiter("-[a-zA-Z]\\s+"); 
    if(sc.hasNext()) 
      System. out.println(sc.next()); 

, 모든 입력 " -v "가 단일 토큰이됩니다. hasNext() 다음 토큰이임을 의미합니다.

Scanner sc = new Scanner("-v "); 
    sc.useDelimiter("-[a-zA-Z]\\s+"); 
    if(sc.hasNext()) 
      System. out.println(sc.next()); 

이것은 구분 기호와 일치하며 스플릿은 0 토큰으로 끝나기 때문에 hasNext()는 false입니다.