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에서는 명명된 그룹을 사용할 수 있기 때문에 훨씬 더 쉽다.
이건 완전히 괜찮아.
- 첫 번째 그룹(
m.group(0)
)는 항상 당신의 정규 표현으로 덮인 전체 영역을 캡처한다.이 경우 전체 끈이다. - 정규식은 기본적으로 욕심이 많아 첫 번째 그룹이 정규식을 위반하지 않고 최대한 캡처한다는 뜻이다.그
(.*)(\\d+)
(regex의 첫 번째 부분)은...QT300
제1그룹과 제1그룹에서0
둘째로 - 첫 번째 그룹을 자유롭지 않은 그룹, 즉 변화로 빠르게 해결할 수 있다.
(.*)
로(.*?)
.
탐욕과 게으름에 대한 자세한 내용은 이 사이트를 참조하십시오.
너의 이해는 정확하다.그러나 다음과 같은 과정을 거치면:
(.*)
끈을 통째로 삼켜 버릴 것이다.- 캐릭터들을 돌려주어야 할 필요가 있을 것이다.
(\\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
'IT이야기' 카테고리의 다른 글
C/C++ 코드에서 주석 제거 (0) | 2022.04.22 |
---|---|
vuex 저장소가 변경될 때 프로펠러 속성 업데이트 (0) | 2022.04.22 |
Threaten, LocalDate를 사용하여 월의 처음 및 마지막 날짜 가져오기 (0) | 2022.04.21 |
Vuejs + 웹 팩: npm 실행 빌드 느림 (0) | 2022.04.21 |
v-for를 사용하여 vue.js를 사용하여 테이블을 렌더링하는 방법 (0) | 2022.04.21 |