itsource

Java regex 캡처 그룹 인덱스

mycopycode 2022. 10. 15. 09:19
반응형

Java regex 캡처 그룹 인덱스

저는 다음과 같은 대사가 있습니다.

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. 이게 뭐죠?0그리고.1누구라도 좋은 예를 들어 설명해 주면 더 좋을 텐데.

  2. regex 패턴에는:그 안에 있는데 왜?group(1)결과가 그걸 빼먹은거야?그룹 1은 괄호 안에 있는 모든 단어를 감지합니까?

  3. 그래서 이렇게 괄호를 두 개 더 넣으면\\s*(\d*)(.*)그럼 두 그룹이 되는 건가요? group(1)를 반환하다(\d*)부분과group(2)을 반환하다(.*)부분?

그 코드 조각은 내 혼란을 없애기 위한 목적으로 제공되었다.그것은 내가 다루고 있는 코드가 아니다.위의 코드는 다음과 같이 할 수 있습니다.String.split()훨씬 쉬운 방법으로요.

캡처 및 그룹화

그룹 캡처 (pattern)는 캡처 속성을 가진 그룹을 만듭니다.

자주 볼 수 있는(및 사용 가능한) 관련 정보는 다음과 같습니다.(?:pattern)이 명령어는 속성을 캡처하지 않고 그룹을 만듭니다.따라서 non-timeout group이라고 명명됩니다.

그룹은 일반적으로 일련의 패턴을 반복해야 할 때 사용됩니다.(\.\w+)+또는 대체를 유효하게 하는 장소를 지정합니다.^(0*1|1*0)$(^,그리고나서0*1또는1*0,그리고나서$)와^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대체 문자열로 지정합니다.

다른 regex 플레이버(PCRE, Perl)에서는 서브루틴 콜에서도 사용할 수 있습니다.

특정 그룹에 의해 일치하는 텍스트에 액세스 할 수 있습니다.그룹 번호는 위에서 설명한 규칙으로 식별할 수 있습니다.

일부 regex 플레이버(PCRE, Perl)에는 다른 브런치브런치에서의 그룹 캡처에 같은 번호사용할 수 있는 브랜치리셋 기능이 있습니다.

그룹명

Java 7에서 이름 있는 캡처 그룹을 정의할 수 있습니다. (?<name>pattern)와 일치하는 콘텐츠에 액세스 할 수 있습니다.regex는 더 길지만 regex와 대조하거나 추출하려는 내용을 나타내므로 코드가 더 의미가 있습니다.

됩니다.\k<name>과 패턴으로${name}대체 문자열로 지정합니다.

있는 부여 방식으로 가 매겨지기 에 이 에는 "번호 부여 방식"을 통해 .Matcher.group(int group).

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

델 이외의 고객에게는

다음은 이 기능의 간단한 예를 제시하겠습니다.

( G1 )( G2 )( G3 )( G4 )( G5 )
([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

보시는 바와 같이 괄호 안에 각각 5개의 그룹을 만들었습니다.

양쪽에 !*와 *!를 넣었습니다.이러한 문자는 RegEx에 없으므로 결과에는 생성되지 않습니다.Group(0)은 일치하는 문자열 전체를 제공합니다(모든 검색 기준을 한 줄로 표시).공백 문자가 검색 조건에 포함되지 않았기 때문에 그룹 1은 첫 번째 공백 직전에 중지됩니다.그룹 2와 4는 단순히 공백입니다.이 경우 문자 그대로 공백 문자이지만 탭이나 줄 바꿈 등이 될 수도 있습니다.그룹 3은 검색 기준에 넣었기 때문에 공간을 포함하고 있습니다... 등

이게 말이 됐으면 좋겠어요.

()정규식입니다.

group(1) 괄호 에 있는 .(.*).*

★★★★★★★★★★★★★★★★★.group(0)에는 일치하는 문자열이 모두 포함되어 있습니다.

그룹이 (「」를 참조해 주세요).(...))는 다음 인덱스(2, 3 등)가 있는 그룹으로 분류됩니다.

언급URL : https://stackoverflow.com/questions/16517689/java-regex-capturing-groups-indexes

반응형