programing

java.util.regex - Pattern.compile()의 중요성

javaba 2022. 9. 23. 23:10
반응형

java.util.regex - Pattern.compile()의 중요성

의 중요성은 무엇입니까?Pattern.compile()방??
한 후 regex를 입니까?Matcher 오브젝트?

예를 들어 다음과 같습니다.

String regex = "((\\S+)\\s*some\\s*";

Pattern pattern = Pattern.compile(regex); // why do I need to compile
Matcher matcher = pattern.matcher(text);

compile()메서드는 항상 어떤 시점에서 호출되며 패턴 개체를 만드는 유일한 방법입니다.그래서 질문은, 왜 그걸 명시적으로 불러야 하는가 하는 것입니다.한 가지 이유는 다음과 같은 메서드를 사용할 수 있도록 Matcher 개체에 대한 참조가 필요하기 때문입니다.group(int)캡처 그룹의 내용을 가져옵니다.의 Matcher를 하는 .matcher()"Pattern"을 사용하는 입니다.compile() 그리고 리리...''...find() method method method method unlike method unlike unlike unlike unlike 달리matches()【String】【String】【String】【String】【Stattern】【Pattern】【Pattern】【Pattern】【Pattern】【Pattern】

또 다른 이유는 동일한 패턴 오브젝트를 반복적으로 작성하지 않기 위해서입니다.String String(또는 static String('스태틱'))에서 중 마다 regex가 됩니다.matches()패턴의 메서드)를 사용하여 새 패턴과 새 매처를 만듭니다. 이 조각 아, 아, 아, 아, 아, 맞다.

for (String s : myStringList) {
    if ( s.matches("\\d+") ) {
        doSomething();
    }
}

...정확히 다음과 같습니다.

for (String s : myStringList) {
    if ( Pattern.compile("\\d+").matcher(s).matches() ) {
        doSomething();
    }
}

확실히, 그것은 불필요한 일을 많이 하고 있다.실제로 regex를 컴파일하여 Pattern 개체를 인스턴스화하는 데 실제 일치보다 시간이 더 오래 걸릴 수 있습니다.따라서 보통 이 단계를 루프에서 빼내는 것이 좋습니다.Matcher를 미리 만들 수도 있지만, 가격은 그다지 비싸지 않습니다.

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("");
for (String s : myStringList) {
    if ( m.reset(s).matches() ) {
        doSomething();
    }
}

.NET, Java의 NET, Java의 NET 정규식이 하는 이 들 수 .compile()메서드는 와 관련되어 있습니다.네 netRegexOptions.Compiled자바어Pattern.compile() .에 NET 정규식「 」를 Compiled★★★★

Regex r = new Regex(@"\d+", RegexOptions.Compiled); 

코드로 하여 처리속도가 및 에는 상당한 이 소요됩니다. 위한 정규어를 CIL 바이트 코드로 직접 컴파일하기 때문에 훨씬 더 빠른 처리를 할 수 있지만 초기 처리 및 메모리 사용에는 상당한 비용이 소요됩니다.것이 자바에 의해 .이후에서 생성되는 패턴과 다른 점은 없습니다.String#matches(String)은 「」로 작성됩니다.Pattern#compile(String).

것을 NET Regex net net net 。부터. 2.은 NET 2.0, NET 2.0 등의 방식에서만 합니다.Regex.Matches()Regex 컨스트럭터를 직접 호출하는 경우는 제외됩니다).

컴파일은 정규 표현을 해석하고 메모리 내 표현을 구축합니다.컴파일하는 오버헤드는 일치에 비해 상당히 커집니다.패턴을 반복적으로 사용하는 경우 컴파일된 패턴을 캐시하는 성능이 향상됩니다.

「 」를 할 때Pattern는 Java에서 검색 몇 계산을 수행합니다.String ( 내 합니다.) (regex의 메모리 내 표현을 구축합니다)

「 」를 는, 「 」를 해 주세요.Pattern 더 를 볼 수 .Pattern★★★★★★ 。

Pattern을 한 번만 사용하는 경우 컴파일 스텝은 추가 코드 행처럼 보이지만 실제로는 일반적인 경우 매우 도움이 됩니다.

성능 및 메모리 사용량에 따라 다르므로 많이 사용해야 할 경우 컴파일하여 패턴을 유지합니다.regex의 일반적인 용도는 유효한 사용자 입력(포맷)에 대한 이며, 이러한 클래스에서는 사용자의 출력 데이터를 포맷하여 준수 패턴을 저장하는 것이 일반적으로 많이 호출되므로 상당히 논리적인 것처럼 보입니다.

다음은 실제로 lot라고 불리는 검증기 샘플입니다.

public class AmountValidator {
    //Accept 123 - 123,456 - 123,345.34
    private static final String AMOUNT_REGEX="\\d{1,3}(,\\d{3})*(\\.\\d{1,4})?|\\.\\d{1,4}";
    //Compile and save the pattern  
    private static final Pattern AMOUNT_PATTERN = Pattern.compile(AMOUNT_REGEX);


    public boolean validate(String amount){

         if (!AMOUNT_PATTERN.matcher(amount).matches()) {
            return false;
         }    
        return true;
    }    
}

@Alan Moore에서 언급했듯이 코드에 재사용 가능한 regex가 있는 경우(루프 전 등) 재사용을 위해 패턴을 컴파일하여 저장해야 합니다.

Pattern.compile()번 수).regex는 스레드세이프입니다.퍼포먼스상의 메리트는 매우 클 수 있습니다.

간단한 벤치마크를 실시했습니다.

    @Test
    public void recompile() {
        var before = Instant.now();
        for (int i = 0; i < 1_000_000; i++) {
            Pattern.compile("ab").matcher("abcde").matches();
        }
        System.out.println("recompile " + Duration.between(before, Instant.now()));
    }

    @Test
    public void compileOnce() {
        var pattern = Pattern.compile("ab");
        var before = Instant.now();
        for (int i = 0; i < 1_000_000; i++) {
            pattern.matcher("abcde").matches();
        }
        System.out.println("compile once " + Duration.between(before, Instant.now()));
    }

compileOnce는 3배에서 4배 더 빨랐다.regex 자체에 따라 크게 달라지는 것 같은데 자주 사용하는 regex의 경우, 저는 regex를 선택하게 됩니다.static Pattern pattern = Pattern.compile(...)

Pattern.로 '.sun.org . http . ]pattern.compile'은 'RECompiler.compile'을 나타냅니다.[ com.sun.org . recompiler . 여기서 internal ]:
1. 패턴 [a-z]는 '가 들어가 있습니다.
2.에는 [.2 . - [ 0-9 ]는 [09]는 [09]는 [09]입니다.
3.[pattern가 포함되어 .3 . ab [ pattern ]는 'aabbcc'를 말합니다.

따라서 컴파일된 코드는 여러 사례를 일반화할 수 있는 좋은 방법입니다.하나, 둘, 셋 하다이 문제는 컴파일된 코드의 현재 및 다음 요소의 ASCII와 비교하여 감소합니다.따라서 쌍이 됩니다. ★★★★★★★★★★★★★★★★★▼
zz 사이에 .a z z 이 ASCII 가 a z z 이 。
'와 'a' 사이에 a'b'입니다. 'a'의 'a'는 ASCII의 'a'이다.

패턴 클래스는 regex 엔진의 진입점입니다.이 명령어는 Pattern.matches() 및 Pattern.comiple()을 통해 사용할 수 있습니다.#이 두 개의 차이.matches()- 텍스트(String)가 지정된 정규 표현 comiple()과 일치하는지 빠르게 확인하기 위해 Pattern의 참조를 만듭니다.그래서 여러 번 사용하여 정규 표현을 여러 텍스트와 일치시킬 수 있습니다.

참조용:

public static void main(String[] args) {
     //single time uses
     String text="The Moon is far away from the Earth";
     String pattern = ".*is.*";
     boolean matches=Pattern.matches(pattern,text);
     System.out.println("Matches::"+matches);

    //multiple time uses
     Pattern p= Pattern.compile("ab");
     Matcher  m=p.matcher("abaaaba");
     while(m.find()) {
         System.out.println(m.start()+ " ");
     }
}

언급URL : https://stackoverflow.com/questions/1720191/java-util-regex-importance-of-pattern-compile

반응형