2013-03-10 3 views
3

Java에서 정규식을 사용하는 중입니다. 책과 Java 문서를 읽고 있는데, 이유는 알 수 없습니다. "[\\s*]"은 구분 기호로 사용할 때 "\\s*"과 같지 않습니다. "[\\s*]""\\s+"과 같습니다. 누군가가 논리적으로 왜 나를 걸을 수 있습니까?[\ s *]가 \ s *와 같은 이유는 무엇입니까?

import java.util.Scanner; 
import java.util.regex.Pattern; 
public class ScanString { 
    public static void main(String[] args) { 
     String str = "Smith , where Jones had had 'had', had had 'had had'."; 
     String regex = "had"; 
     System.out.println("String is:\n" + str + "\nToken sought is " + regex); 

     Pattern had = Pattern.compile(regex); 
     Scanner strScan = new Scanner(str); 
     strScan.useDelimiter("\\s*"); 
     int hadCount = 0; 
     while(strScan.hasNext()) { 
      if(strScan.hasNext(had)) { 
       ++hadCount; 
       System.out.println("Token found!: " + strScan.next(had)); 

      } else { 
       System.out.println("Token is : " + strScan.next()); 
      } 
     } 
     System.out.println("Count is: " + hadCount); 
    } 
}

나에게 맞는 출력은 모든 공백이 아닌 문자를 별도의 토큰으로 사용합니다. 구분 기호가 "\\s+" 또는 "[\\s*]"으로 변경되면 출력은 문자 클래스를 묶는

String is: 
Smith , where Jones had had 'had', had had 'had had'. 
Token sought is had 
Token is : Smith 
Token is : , 
Token is : where 
Token is : Jones 
Token found!: had 
Token found!: had 
Token is : 'had', 
Token found!: had 
Token found!: had 
Token is : 'had 
Token is : had'. 
Count is: 4

답변

4

Brackets []입니다. 그 안에는 특수 문자에 대한 규칙이 다릅니다. 특수 문자는 "닫는 대괄호 (]), 백 슬래시 (\), 캐럿 (^) 및 하이픈 (-)"입니다. (this page에서 가져옴)

따라서이 경우 [\\s*]은 "공백이거나 *"을 의미합니다.

정규 표현식을 다룰 때 RegexPlanet (코드 테스트) 또는 Regexper (그래픽으로 정규 표현식을 시각화)과 같은 웹 사이트를 사용할 수 있습니다.

+0

흥미 롭다 - 내 책의 저자는 오해의 소지가있다! 그는 특수 문자로 의도 된 대괄호 안의 *를 사용했지만 어쨌든 예제는 작동했습니다. –

+0

@svenoaks - yea. '[*]'를 사용하는 것은 조금 비 재래 적입니다. 그러나 기능적으로는'\ *'와 동등하지만 자바 문자열 리터럴에'\\ *'로 써야합니다. 괄호로 묶은 버전이 더 읽기 쉽다고 주장 할 수 있습니다. –

1

[]characters class입니다. 이 예를 보자. [abc]a|b|c을 의미한다. [a*]과 같은 것을 만들면 a|\\* (a 또는 * 문자)을 의미합니다.

관련 문제