이 compile()
메서드는 항상 어떤 지점에서 호출됩니다. 이것이 Pattern 객체를 생성하는 유일한 방법입니다. 그래서 질문은 정말로, 왜 그것을 명시 적으로 불러야 합니까? 한 가지 이유는 Matcher 개체에 대한 참조가 필요하므로 group(int)
캡처 그룹의 내용을 검색하는 것과 같은 메서드를 사용할 수 있기 때문 입니다. Matcher 개체를 유지 matcher()
하는 유일한 방법 은 Pattern 개체의 메서드 를 사용하는 것이며 Pattern 개체를 유지 하는 유일한 방법은 compile()
메서드 를 사용하는 것입니다. 그런 다음 find()
과 달리 matches()
String 또는 Pattern 클래스에서 중복되지 않는 메서드가 있습니다.
다른 이유는 동일한 Pattern 객체를 반복해서 생성하지 않는 것입니다. String에서 정규식 기반 메서드 (또는 matches()
Pattern 의 정적 메서드) 중 하나를 사용할 때마다 새 패턴과 새 Matcher가 생성됩니다. 따라서이 코드 스 니펫 :
for (String s : myStringList) {
if ( s.matches("\\d+") ) {
doSomething();
}
}
... 다음과 정확히 동일합니다.
for (String s : myStringList) {
if ( Pattern.compile("\\d+").matcher(s).matches() ) {
doSomething();
}
}
분명히 그것은 많은 불필요한 작업을하고 있습니다. 실제로 실제 일치를 수행하는 것보다 정규식을 컴파일하고 Pattern 객체를 인스턴스화하는 데 더 오래 걸릴 수 있습니다. 따라서 일반적으로 루프에서 해당 단계를 당기는 것이 좋습니다. 거의 비싸지는 않지만 Matcher를 미리 만들 수도 있습니다.
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("");
for (String s : myStringList) {
if ( m.reset(s).matches() ) {
doSomething();
}
}
.NET 정규식에 익숙하다면 Java의 compile()
메서드가 .NET의 RegexOptions.Compiled
수정 자 와 관련 이 있는지 궁금 할 것입니다 . 내 대답은 아니오 야. Java의 Pattern.compile()
메서드는 .NET의 Regex 생성자와 동일합니다. Compiled
옵션 을 지정하는 경우 :
Regex r = new Regex(@"\d+", RegexOptions.Compiled);
... 정규식을 CIL 바이트 코드로 직접 컴파일하여 훨씬 빠르게 수행 할 수 있지만 선행 처리 및 메모리 사용에 상당한 비용이 소요됩니다. 정규식을위한 스테로이드라고 생각하면됩니다. Java에는 이에 상응하는 것이 없습니다. 에서 만든 패턴과을 String#matches(String)
사용하여 명시 적으로 만든 패턴 사이에는 차이가 없습니다 Pattern#compile(String)
.
(편집 : 원래 모든 .NET Regex 개체가 캐시되어 있다고 말했는데 이는 올바르지 않습니다. .NET 2.0 이후로 자동 캐싱 Regex.Matches()
은 Regex 생성자를 직접 호출 할 때가 아니라와 같은 정적 메서드에서만 발생합니다 . ref )