developer tip

Java 정규식 캡처 그룹 색인

optionbox 2020. 8. 3. 08:30
반응형

Java 정규식 캡처 그룹 색인


다음 줄이 있습니다.

typeName="ABC:xxxxx;";

단어를 가져와야합니다 ABC.

다음 코드 스 니펫을 작성했습니다.

Pattern pattern4=Pattern.compile("(.*):");
matcher=pattern4.matcher(typeName);

String nameStr="";
if(matcher.find())
{
    nameStr=matcher.group(1);

}

그래서 넣으면 group(0)내가 얻을 ABC:하지만 난 세우면 group(1)그것은이다 ABC내가 알고 싶은, 그래서

  1. 이 무엇을 않습니다 01의미? 누군가가 좋은 예를 들어 설명해 주시면 더 좋을 것입니다.

  2. 정규식 패턴에 포함되어 :있으므로 group(1)결과가 생략되는 이유 는 무엇입니까? 그룹 1은 괄호 안의 모든 단어를 감지합니까?

  3. 따라서 \\s*(\d*)(.*)다음 과 같이 괄호를 두 개 더 넣으면 두 그룹이 있습니까? 부품 group(1)을 반환하고 (\d*)부품을 group(2)반환 (.*)합니까?

코드 스 니펫은 혼란을 없애기 위해 제공되었습니다. 내가 다루는 코드가 아닙니다. 위에 주어진 코드 String.split()는 훨씬 쉬운 방법 으로 수행 할 수 있습니다 .


캡처 및 그룹화

캡처 그룹 캡처 속성 (pattern)있는 그룹만듭니다 .

자주 보거나 사용하는 관련 속성은 속성 캡처 하지 않고 그룹(?:pattern) 을 생성 하므로 이름이 non-capturing group 입니다.

그룹은 일반적으로 패턴 시퀀스를 반복해야 (\.\w+)+하거나 교체가 적용되는 위치 ^(0*1|1*0)$( 예 : ( ^, then 0*1또는 1*0, then $) 대 ^0*1|1*0$( ^0*1또는 1*0$)) 를 지정 해야 할 때 주로 사용됩니다 .

캡처 그룹은 그룹화를 제외하고 캡처 그룹 내부의 패턴과 일치하는 텍스트를 기록합니다 (pattern). 귀하의 예제를 사용하여 (.*):, .*일치 ABC:경기가 :있기 때문에, 그리고 .*그룹을 캡처 안에 (.*)텍스트가 ABC캡처 그룹 1에 대한 기록됩니다.

그룹 번호

전체 패턴은 그룹 번호 0으로 정의 됩니다.

패턴의 모든 캡처 그룹은 1부터 인덱싱을 시작합니다. 인덱스는 캡처 그룹의 여는 괄호 순서에 따라 정의됩니다 . 예를 들어, 아래 패턴에있는 5 개의 캡처 그룹 모두 있습니다.

(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
|     |                       |          | |      |      ||       |     |
1-----1                       |          | 4------4      |5-------5     |
                              |          3---------------3              |
                              2-----------------------------------------2

그룹 번호는 \n패턴 및 $n대체 문자열에서 역 참조 사용됩니다 .

다른 정규식 플레이버 (PCRE, Perl)에서는 서브 루틴 호출 에도 사용될 수 있습니다 .

을 사용하여 특정 그룹과 일치하는 텍스트에 액세스 할 수 있습니다 Matcher.group(int group). 그룹 번호는 위에서 언급 한 규칙으로 식별 할 수 있습니다.

일부 정규식 플레이버 (PCRE, Perl)에는 서로 다른 번갈아 분기에서 그룹캡처 하는 데 동일한 번호 를 사용할 수 있는 분기 재설정 기능이 있습니다 .

그룹 이름

Java 7부터는 명명 된 캡처 그룹을 정의 할 수 (?<name>pattern)있으며와 일치하는 컨텐츠에 액세스 할 수 있습니다 Matcher.group(String name). 정규식은 더 길지만 코드는 정규식과 일치하거나 추출하려고하는 것을 나타 내기 때문에 더 의미가 있습니다.

그룹 이름은 \k<name>패턴 및 ${name}대체 문자열에서 역 참조 사용됩니다 .

명명 된 캡처 그룹은 여전히 ​​동일한 번호 체계로 번호가 매겨 지므로을 통해 액세스 할 수도 있습니다 Matcher.group(int group).

내부적으로 Java 구현은 이름에서 그룹 번호로 매핑됩니다. 따라서 두 개의 다른 캡처 그룹에 동일한 이름을 사용할 수 없습니다.


우리를 위해

이것이 작동하는 방법에 대한 간단하고 명확한 예입니다.

정규식 : ([a-zA-Z0-9]+)([\s]+)([a-zA-Z ]+)([\s]+)([0-9]+)

끈: "!* UserName10 John Smith 01123 *!"

group(0): UserName10 John Smith 01123
group(1): UserName10
group(2):  
group(3): John Smith
group(4):  
group(5): 01123

보시다시피, 나는 각각 괄호로 묶인 다섯 그룹을 만들었습니다.

I included the !* and *! on either side to make it clearer. Note that none of those characters are in the RegEx and therefore will not be produced in the results. Group(0) merely gives you the entire matched string (all of my search criteria in one single line). Group 1 stops right before the first space because the space character was not included in the search criteria. Groups 2 and 4 are simply the white space, which in this case is literally a space character, but could also be a tab or a line feed etc. Group 3 includes the space because I put it in the search criteria ... etc.

Hope this makes sense.


Parenthesis () are used to enable grouping of regex phrases.

The group(1) contains the string that is between parenthesis (.*) so .* in this case

And group(0) contains whole matched string.

If you would have more groups (read (...) ) it would be put into groups with next indexes (2, 3 and so on).

참고URL : https://stackoverflow.com/questions/16517689/java-regex-capturing-groups-indexes

반응형