2014-04-14 4 views
1

내 질문에 String.matches()과 함께 사용할 경우 Pattern.compile()을 사용하여 컴파일 된 패턴을 재사용 할 수 있습니까? Java의 재사용 패턴 인스턴스

가 말하는 문서에서, 때문에

,

matches 방법은 정규 표현식은 한 번만 사용하는 경우의 편의를이 클래스에 의해 정의된다. 이 메서드는 표현식을 컴파일하고 호출에서 입력 시퀀스와 일치시킵니다. 반복되는 것이 컴파일 된 패턴이 재사용되는 것을 허용하지 않기 때문에이 효율성이 떨어집니다 일치하지만 문

boolean b = Pattern.matches("a*b", "aaaaab"); 

은, 위의 세 문에 해당합니다.

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

그것은 단지 당신이 Pattern.matches를 사용할 때 덜 효율적이된다라고 말한다.

형태 str.matches(regex)의 메소드 호출은 정확히 내가 아니다

Pattern.matches(regex, str) 

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#matches(java.lang.String)

그래서 표현과 같은 결과를 를 산출 : 그리고이 부분에 혼란있어 String.matchesPattern.matches을 사용하고 그 때문에 컴파일 된 패턴을 다시 사용할 수 없기 때문에 확실합니다. 사실 컴파일 된 패턴을 상수 (최적화 목적으로)로 설정하려고했습니다.

+0

를 사용하고자 할 때마다 정규를 얻을 수 있습니다 :

당신은 예를 들어, Pattern 클래스의 인스턴스를 저장하여 컴파일 된 패턴을 다시 사용할 수 있습니다 'String.matches()'를 사용할 때 컴파일 된 패턴에 접근 할 수 없으므로, no. 그리고 당신은 그것을 잘못 읽고 있습니다. 그것 때문에,'String.matches()'(그리고'Pattern.matches()'같은 것)는 컴파일 할 때마다 패턴을 컴파일하기 때문에 컴파일 된 패턴을 재사용하는 것보다 비효율적입니다 그것. –

답변

6

Pattern.matches() 메서드는 정적 메서드이므로 컴파일 된 패턴을 다시 사용하려는 경우에는 사용할 수 없습니다. 컴파일 된 패턴은 Pattern 클래스의 인스턴스입니다. Pattern.matches() 정규식을 사용할 때마다 컴파일합니다.

Pattern pattern = Pattern.compile("^[a-z]+$", Pattern.CASE_INSENSITIVE); // you can store this instance 

그런 다음이 패턴은 잘 그것을

Matcher m = pattern.matcher("Testing"); 
+0

"match trap"('.matches()'는 전체 입력을 고려하고 "실제"정규식 매칭을하지 않습니다.) – fge

+0

@fge 맞아요, 그 대답은 정말로 중요하지 않으므로 제거했습니다. 사람들을 혼란스럽게하지 마십시오. – Szymon

+0

새로운 혼란을 피하기 위해 대상 문자열과 일치하는 정규식을 사용할 수도 있습니다. 그것은 아주 사소한 일이지만, 그럴만한 가치가 있다고 생각합니다. –