IT이야기

Java Regex 캡처 그룹

cyworld 2022. 4. 22. 21:05
반응형

Java Regex 캡처 그룹

나는 이 코드 블록을 이해하려고 노력하고 있다.첫째로, 우리가 그 표현에서 찾고 있는 것은 무엇인가?

내가 이해한 것은 어떤 문자(0회 이상 *)이고, 그 다음이 0~9회(1회 이상 +)이고, 그 다음이 어떤 문자(0회 이상 *)라는 것이다.

이 작업이 실행되면 결과는 다음과 같다.

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

누가 나와 함께 이것을 검토해 주시겠습니까?

캡처 그룹을 사용할 경우의 이점은?

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTut3 {

    public static void main(String args[]) {
        String line = "This order was placed for QT3000! OK?"; 
        String pattern = "(.*)(\\d+)(.*)";

        // Create a Pattern object
        Pattern r = Pattern.compile(pattern);

        // Now create matcher object.
        Matcher m = r.matcher(line);

        if (m.find()) {
            System.out.println("Found value: " + m.group(0));
            System.out.println("Found value: " + m.group(1));
            System.out.println("Found value: " + m.group(2));
        } else {
            System.out.println("NO MATCH");
        }
    }

}

당신이 겪고 있는 문제는 정량기의 종류에 관한 것이다.첫 번째 그룹에서 욕심 많은 정량자를 사용하고 있는 경우(색인 1 - 인덱스 0은 전체 값을 나타냄)Pattern() 즉, 가능한 한 많이 일치한다는 의미(그리고 어떤 캐릭터인지라 다음 그룹의 조건을 충족시키기 위해 있는 만큼 많은 캐릭터와 일치한다는 의미).

간단히 말해서, 당신의 첫 번째 그룹은.*다음 그룹만큼 긴 모든 것을 일치시킨다.\\d+무엇과 일치시킬 수 있다(이 경우, 마지막 자리).

세 번째 그룹과 마찬가지로 마지막 자리 이후의 어떤 것도 매치할 것이다.

첫 번째 그룹의 원치 않는 계량기로 바꾸면, 예상한 결과, 즉 3000 부분을 얻을 수 있을 겁니다.

첫 번째 그룹의 물음표를 기록해 두십시오.

String line = "This order was placed for QT3000! OK?";
Pattern pattern = Pattern.compile("(.*?)(\\d+)(.*)");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
    System.out.println("group 1: " + matcher.group(1));
    System.out.println("group 2: " + matcher.group(2));
    System.out.println("group 3: " + matcher.group(3));
}

출력:

group 1: This order was placed for QT
group 2: 3000
group 3: ! OK?

Java에 대한 추가 정보Pattern 여기

마지막으로 캡처 그룹은 원형 대괄호로 구분되며, 일단 백업 참조를 사용할 수 있는 매우 유용한 방법을 제공한다.Pattern입력과 일치한다.

Java 6에서 그룹은 순서에 의해서만 참조될 수 있다(내포된 그룹의 조심성과 주문의 미묘함).

자바 7에서는 명명된 그룹을 사용할 수 있기 때문에 훨씬 더 쉽다.

이건 완전히 괜찮아.

  1. 첫 번째 그룹(m.group(0))는 항상 당신의 정규 표현으로 덮인 전체 영역을 캡처한다.이 경우 전체 끈이다.
  2. 정규식은 기본적으로 욕심이 많아 첫 번째 그룹이 정규식을 위반하지 않고 최대한 캡처한다는 뜻이다.(.*)(\\d+)(regex의 첫 번째 부분)은...QT300제1그룹과 제1그룹에서0둘째로
  3. 첫 번째 그룹을 자유롭지 않은 그룹, 즉 변화로 빠르게 해결할 수 있다.(.*)(.*?).

탐욕과 게으름에 대한 자세한 내용은 이 사이트를 참조하십시오.

너의 이해는 정확하다.그러나 다음과 같은 과정을 거치면:

  • (.*)끈을 통째로 삼켜 버릴 것이다.
  • 캐릭터들을 돌려주어야 할 필요가 있을 것이다.(\\d+)사티스트라이프(그래서)0잡혔고, 잡히지는 않았다.3000);
  • 이 최후의 것(.*)나머지를 잡아낼 거야

그러나 저자의 본래 의도가 무엇이었는지는 확실치 않다.

문서:

Capturing groups</a> are indexed from left
 * to right, starting at one.  Group zero denotes the entire pattern, so
 * the expression m.group(0) is equivalent to m.group().

그래서 캡처 그룹 0은 전체 라인을 전송한다.

참조URL: https://stackoverflow.com/questions/17969436/java-regex-capturing-groups

반응형