수색…


기본 캡처 그룹

그룹 은 괄호 () 묶인 정규 표현식의 섹션입니다. 이것은 일반적으로 "하위 표현"이라고하며 두 가지 용도로 사용됩니다.

  • 그것은 서브 표현식을 원자 적으로 만든다. 즉, 전체적으로 일치, 실패 또는 반복 할 것이다.
  • 일치 된 텍스트의 부분은 나머지 표현식과 나머지 프로그램에서 액세스 할 수 있습니다.

그룹은 정규식 엔진에서 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>...))


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow