Regular Expressions
그룹 캡처
수색…
기본 캡처 그룹
그룹 은 괄호 ()
묶인 정규 표현식의 섹션입니다. 이것은 일반적으로 "하위 표현"이라고하며 두 가지 용도로 사용됩니다.
- 그것은 서브 표현식을 원자 적으로 만든다. 즉, 전체적으로 일치, 실패 또는 반복 할 것이다.
- 일치 된 텍스트의 부분은 나머지 표현식과 나머지 프로그램에서 액세스 할 수 있습니다.
그룹은 정규식 엔진에서 1부터 시작하여 번호가 매겨집니다. 전통적으로 최대 그룹 수는 9이지만 많은 현대식 정규 표현식은 더 많은 그룹 수를 지원합니다. 그룹 0은 항상 전체 패턴을 일치시킵니다. 대괄호로 전체 정규식을 둘러싸는 것과 같은 방식입니다.
서수는 괄호 앞에 하나씩 추가되거나 중첩 된 위치에 관계없이 각 여는 괄호로 증가합니다.
foo(bar(baz)?) (qux)+|(bla)
1 2 3 4
그룹 및 번호
표현이 전체 일치를 달성 한 후에는 특정 그룹이 어떤 것과도 매치 할 수 있는지 여부와 상관없이 모든 그룹이 사용 중입니다.
그룹은 (baz)?
와 같이 선택 사항 일 수 (baz)?
또는 위의 (bla)
와 같이 일치 항목에서 사용되지 않은 표현의 대체 부분에서 사용할 수 있습니다. 이 경우 일치하지 않는 그룹에는 정보가 포함되지 않습니다.
수량 (qux)+
가 (qux)+
와 같이 그룹 뒤에 배치되면 표현식의 전체 그룹 수는 그대로 유지됩니다. 그룹이 두 번 이상 일치하면 해당 내용이 마지막으로 일치하는 항목이됩니다. 그러나 현대식 정규 표현식을 사용하면 모든 하위 일치 항목에 액세스 할 수 있습니다.
다음과 같은 로그 항목의 날짜 및 오류 수준을 검색하려면 다음을 수행하십시오.
2012-06-06 12:12.014 ERROR: Failed to connect to remote end
다음과 같이 사용할 수 있습니다.
^(\d{4}-\d{2}-\d{2}) \d{2}:\d{2}.\d{3} (\w*): .*$
이렇게하면 로그 항목 2012-06-06
의 날짜가 캡처 그룹 1로 추출되고 오류 수준 ERROR
는 캡처 그룹 2로 추출됩니다.
역 참조 및 비 캡처 그룹
그룹은 "번호가 매겨지기"때문에 일부 엔진은 그룹이 이전에 다시 매치 한 것과 일치하는 것을 지원합니다.
두 개의 문자열이 길이가 3 인 문자열을 $
로 나눈 값과 일치 시키려한다고 가정하면 다음을 사용합니다.
(.{3})\$\1
다음 문자열 중 하나와 일치합니다.
"abc$abc"
"a b$a b"
"af $af "
" $ "
그룹에 엔진 번호가 지정되지 않도록하려면 캡처하지 않는 것으로 선언 할 수 있습니다. 캡처하지 않는 그룹은 다음과 같습니다.
(?:)
그룹이 "원자"로 사용될 수 있기 때문에 특정 패턴을 여러 번 반복하는 것이 특히 유용합니다. 중히 여기다:
(\d{4}(?:-\d{2}){2} \d{2}:\d{2}.\d{3}) (.*)[\r\n]+\1 \2
이것은 동일한 시간 소인 W 동일한 항목을 갖는 인접 행의 두 로깅 항목과 일치합니다.
명명 된 캡처 그룹
일부 정규 표현식은 명명 된 캡처 그룹을 허용 합니다 . 수치 인덱스가 아닌 후속 코드에서 이러한 그룹을 이름으로 참조 할 수 있습니다. 예를 들어, 역 참조, 프로그램의 다음 줄에있는 바꾸기 패턴에서 참조 할 수 있습니다.
숫자 인덱스는 표현식에서 그룹의 수나 배열이 변경 될 때마다 변하므로 비교시 더 취약합니다.
예를 들어, 작은 따옴표 ( ['"]
)로 묶인 단어 ( \w+
)를 찾으려면 다음을 사용할 수 있습니다.
(?<quote>['"])\w+\k{quote}
어느 것과 같습니다 :
(['"])\w+\1
이와 같은 단순한 상황에서 일반적인 번호가 지정된 캡처 그룹에는 단점이 없습니다.
좀 더 복잡한 상황에서 명명 된 그룹을 사용하면 표현의 구조가 독자에게 더 분명 해져서 유지 보수성이 향상됩니다.
로그 파일 구문 분석은 그룹 이름을 사용하는보다 복잡한 상황의 예입니다. 이것은 Apache Common Log Format (CLF)입니다.
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
다음 표현식은 부품을 명명 된 그룹으로 캡처합니다.
(?<ip>\S+) (?<logname>\S+) (?<user>\S+) (?<time>\[[^]]+\]) (?<request>"[^"]+") (?<status>\S+) (?<bytes>\S+)
구문은 맛에 따라 다르며 일반적으로 다음과 같습니다.
-
(?<name>...)
-
(?'name'...)
-
(?P<name>...)
하위 참조 :
-
\k<name>
-
\k{name}
-
\k'name'
-
\g{name}
-
(?P=name)
.NET에서 여러 그룹에 동일한 이름을 공유 할 수 있으며 캡처 스택 을 사용합니다.
PCRE에서 (?J)
한정자 ( PCRE_DUPNAMES
)를 사용하거나 분기 재설정 그룹 (?|)
(?J)
을 사용하여 명시 적으로 활성화해야합니다. 마지막 캡처 된 값만 액세스 할 수 있습니다.
(?J)(?<a>...)(?<a>...)
(?|(?<a>...)|(?<a>...))