2011-02-26 2 views
0

인자로 패턴을 가져 와서 부정 된 패턴을 반환하는 메소드가 필요합니다. 입력 패턴은 항상 charclass입니다 (그렇지 않으면 불가능합니다). 똑 바른 시도부정화 된 charclass 패턴을 만드는 방법은 무엇입니까?

public Pattern negate(Pattern p) { 
    return Pattern.compile("[^" + p.pattern() + "]"); 
} 

private void test() { 
    final Pattern p = Pattern.compile("[a-z]"); 
    final Pattern n = negate(p); 
    System.out.println(n.matcher("0").matches()); 
} 

중첩 charclass의 시작으로 문자 대신 취해지고 ([^xyz[ 달리) 때문에 [[^[에 실패합니다.

답변

0

그런 캐릭터 클래스를 중첩 할 수 없습니다.

당신은 항상 당신이 문자 클래스를 받고 있다는 것을 알고 있다면, 가장 쉬운 방법은 브래킷의 입력 문자열 트림하는 것입니다 :

public Pattern negate(Pattern p) { 
    return Pattern.compile("[^" + p.pattern().substring(1)); 
} 

는보다 강력한 방법은 정기적으로 입력을 구문 분석하는 것을 expresions ... :)

+0

네 말이 맞아. 집합 차이 연산자'--'가 없기 때문에 가능성이 없습니다. caret가 그들을 무효로하지 않기 때문에, 네스트 한 char 클래스에서는 당신의 솔루션이 작동하지 않습니다. – maaartinus

관련 문제