수색…


기초

역 참조는 이전에 캡처 그룹과 일치 한 텍스트와 일치하는 데 사용됩니다. 이것은 패턴의 이전 부분을 재사용하고 두 문자열 일치를 보장하는 데 도움이됩니다.

예를 들어, 문자열에 0에서 9까지의 숫자가 있는지 확인하려는 경우 하이픈, 슬래시 또는 공백, 소문자, 다른 구분 기호, 0에서 9까지의 다른 숫자와 같은 구분 기호를 사용할 수 있습니다. 다음과 같은 정규식을 사용하십시오.

[0-9][-/ ][a-z][-/ ][0-9]

이것은 1-a-4 와 일치하지만 1-a/4 또는 1 a-4 와도 일치합니다. 구분 기호를 일치 시키려면 캡처 그룹 과 역 참조를 사용할 수 있습니다. 뒤로 참조는 표시된 캡처 그룹에서 발견 된 일치 항목을보고 역 참조의 위치가 정확히 일치하는지 확인합니다.

같은 예제를 사용하면 정규식은 다음과 같이됩니다.

[0-9]([-/ ])[a-z]\1[0-9]

\1 은 패턴의 첫 번째 캡처 그룹을 나타냅니다. 이 작은 변화로 정규 표현식은 이제 1-a-4 1 a-4 또는 1-a/4 아닌 1 a-4 1-a-4 또는 1 a 4 와 일치합니다.

뒤로 참조에 사용할 번호는 캡처 그룹의 위치에 따라 다릅니다. 숫자는 1에서 9까지이며 캡처 그룹을 세어서 찾을 수 있습니다.

([0-9])([-/ ])[a-z][-/ ]([0-9])
|--1--||--2--|          |--3--|

중첩 된 캡처 그룹은이 수를 약간 변경합니다. 먼저 외부 캡쳐 그룹을 계산 한 다음 다음 레벨을 계산하고 둥지를 떠날 때까지 계속합니다.

(([0-9])([-/ ]))([a-z])
 |--2--||--3--|
|-------1------||--4--|

모호한 역 참조

문제 : 특정 형식의 텍스트를 일치시켜야합니다 (예 :

1-a-0
6/p/0
4 g 0

그것은 숫자, 분리 기호 ( - , / 또는 공백 중 하나), 문자, 동일한 구분 기호 및 0입니다.

Naive Solution : Basics 예제 에서 정규 표현식을 적용하면이 정규식을 생각해 낼 수 있습니다.

[0-9]([-/ ])[a-z]\10

하지만 아마 작동하지 않을 것입니다. 대부분의 정규 표현식은 9 개 이상의 캡쳐 그룹을 지원하며, 캡쳐 그룹이 하나뿐이므로 \10 은 그룹 1에 대한 역 참조이어야하며 그 다음에 리터럴 0 있어야한다는 것을 깨닫기에 충분합니다. 대부분의 맛은 그룹 10에 대한 역 참조로 취급됩니다. 그룹 10이 없기 때문에 그 중 일부는 예외를 발생시킵니다. 나머지는 단순히 일치하지 않습니다.

이 문제를 피하는 데는 여러 가지 방법이 있습니다. 하나는 명명 된 그룹 (및 명명 된 역 참조)을 사용하는 것입니다.

[0-9](?<sep>[-/ ])[a-z]\k<sep>0

정규 표현식 언어가 지원하는 경우 \g{n} ( n 은 숫자) 형식은 역 참조 번호를 중괄호로 묶어 뒤의 숫자와 구분할 수 있습니다.

[0-9]([-/ ])[a-z]\g{1}0

또 다른 방법은 확장 된 정규 표현식을 사용하여 공백이없는 요소를 분리하는 것입니다 (Java에서는 괄호 안의 공백을 이스케이프 처리해야합니다).

(?x) [0-9] ([-/ ]) [a-z] \1 0

정규 표현식이 이러한 기능을 지원하지 않는다면 캡처하지 않는 그룹과 같이 불필요하지만 무해한 구문을 추가 할 수 있습니다.

[0-9]([-/ ])[a-z](?:\1)0

... 또는 더미 한정 기호 (아마도 이것은 {1} 이 유용한 유일한 환경 일 수 있습니다) :

[0-9]([-/ ])[a-z]\1{1}0


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