2016-08-01 3 views
2

Java가 일관성없는 정규식 패턴을 처리하는 방법은 무엇입니까? 나는 이것을 시도하고있다 :Java의 일치하지 않는 정규식 문자 클래스

Pattern p = Pattern.compile("[a-d[m-p][^d][m]]"); 
Matcher m = p.matcher("d"); 
System.out.println(m.matches()); 

나는 사실을 알고있다. 그러나, 내 문자 클래스에 [^ d]가 포함되어 있으므로 정규식에 따라 일치하지 않아야합니다. 그러나 d도 패턴 (a-d)에 포함되어 있기 때문에 일치하는 결과는 양수입니다. 그렇다면 패턴 분석은 어떻게 이루어 집니까? 그것이 예외를 던지면 더 좋지 않을까요?

+0

왜 일관성이 없습니까? Java에서는 꽤 괜찮습니다. –

+0

패턴에 문자 "d"를 포함시키고 제외 시켰기 때문에 일관성이 없습니다. – randombee

+1

'-verbose' 옵션이있는 "똑똑한"컴파일러가''[m] 옵션에 불필요한 것을 알려줄지라도 [^ d]는 효과가 없습니다. "&& [^ d]"? "가장 좋은 점은 ** FindBugs **와 같은 도구로 그러한 결함을 표시하는 것입니다. –

답변

5

동작이 정확하고 documented :

문자 클래스는 다른 문자 클래스 내에서 나타날 수 있으며 결합 연산자 (implicit)과 교차 연산자 (&&)로 구성 될 수있다.

또한 Java Character Classes reference 참조 : [a-dm-p]은 (연합)

따라서, 패턴이 일치 : d, 또는mp을 통해

[a-d[m-p]]a을 통해

,
  • [ -하지 d또는
  • [m] - -p또는
  • [^d] 통해 m-ad또는
  • [m-p]을 통해 -
  • a-d 문자 클래스의 시작
  • ] - 문자 클래스의 끝.

da-d과 일치하면 일치가 반환됩니다. 당신이 그들 중 일부를 제외하고 문자 의 범위를 일치 시키려면

, 당신은 뺄셈이 필요합니다

[a-d[m-p][m]&&[^d]] 

a-d 범위 이후 d 일치하지 않습니다이 정규식은 지금과 "강화"입니다 &&[^d]이며 더 이상 d와 일치하지 않습니다.

+0

사실, 노동 조합이 단순한 "OR"인 것을 완전히 잊어 버렸습니다. 감사합니다 – randombee

+1

예. 그냥 참고하시기 바랍니다 : http://www.ocpsoft.org/tutorials/regular-expressions/java-visual-regex-tester/에서 정규식을 신속하게 시각적으로 테스트 할 수 있습니다. –

관련 문제