2010-02-10 6 views
8

이 아닌 그룹에서 표현식을 사용하는 방법이 있습니까? 그룹에 걸려 들지 않습니까?정규 표현식에서 선택적 블록으로 그룹 번호 매기기

예. 옵션 블록 (B|C)?(F|G)? 필요 브래킷

(A(B|C)?) D (E(F|G)?) 

를 적어 둡니다 : 나는 이런 식 무언가가있다.
나는이 그룹들에 걸린 것에 관심이 없다. 내가 원하는 건 처음과 마지막 블록을 전부 잡는거야.

그러나 때문에 선택 블록 그룹 번호가 변경됩니다 그리고 난 (E(F|G)?) 그룹 2 또는 3으로 잡힌 경우

난 결과 그룹의 옵션 부분을 무시하는 표현을 말할 수 말할 수 없다 그룹 번호는 동일하게 유지됩니까? 또는 선택적 캐치를 그룹으로 항상 표시 할 수 있습니까? null 일 때도 가능합니까? 같은 그룹의 경기가 참조 할 수 없습니다

(A(?:B|C)?) D (E(?:F|G)?) 

:

답변

15

(E(F|G)?) 항상 기 제 번호는 패턴 문자열 괄호 개방 순서에 의해 결정되는 바와 같이 잡힐 것이다

(A(B|C)?) D (E(F|G)?) 
^^  ^^ 
1 2   3 4 

(B|C)하면 다음 입력 문자열에서 group(2) 발생하지 않는 것 null는 돌려 주지만, 후속 그룹의 번호는 재 지정되지 않습니다.

번호 매기기에 영향을 미치지 않는 유일한 그룹은 비 캡처 그룹입니다.

(A(?:B|C)?) D (E(?:F|G)?) 
^   ^
1    2 

예 :

Pattern pattern = Pattern.compile("(A(B|C)?) D (E(F|G)?)"); 
Matcher matcher = pattern.matcher("A D EG"); 
if (matcher.matches()) { 
    System.err.println(matcher.group(1)); 
    System.err.println(matcher.group(2)); 
    System.err.println(matcher.group(3)); 
    System.err.println(matcher.group(4)); 
} 

출력 :

A 
null 
EG 
G 
+0

네 말이 맞아. 분명히 나는 ​​식스 플러그인 인 QuickREx에 속아 넘어갔습니다. QuickREx는 3 개의 그룹 만 보여 주었지만 (인덱스 1, 3 및 4). 그러나 비 캡처 비트는 잡음을 줄이기 위해 여전히 매우 편리합니다. – Stroboskop

9

비 캡처 그룹 (?:…)있다.