2009-05-29 3 views
16

정규 표현식을 동일한 정규 표현식의 다른 부분을 기반으로 일치시킬 수 있습니까?정규 표현식의 반복 부분 문자열 일치

예를 들어, 문자가 무엇이든 관계없이 3 자의 동일한 순서로 시작하고 끝나는 행을 어떻게 일치시킬 수 있습니까?

일치 :

abcabc 
xyz abc xyz 

가 일치하지 않습니다 :

abc123 

정의되지 않은 : 이상적으로

ababa 
a 

(일치하거나 할 수 없습니다, 중 가장 쉬운 방법입니다), 내가 좋아하는 것 펄 정규 표현식의 어떤 것. 그게 가능하지 않다면, 할 수있는 맛이 있는지 알고 싶습니다.

답변

19

캡처 그룹 및 역 참조를 사용하십시오.

/^(.{3}).*\1$/ 

\1

처음 캡쳐 그룹의 내용합니다 ( ()의 내용)에 의해 일치대로 다시 가리킨다. 대부분의 언어에서 Regexes는 이와 같은 것을 허용합니다.시작 부분과 끝 부분에 같은 문자를 들면

+3

어, 실제로 찾기/바꾸기의 대체 부분에서 수년간 캡처 그룹 및 역 참조를 사용하고 있습니다. 한번도 원래의 매치 패턴으로 사용할 수 있을지는 몰랐습니다. – Whatsit

13

backreferences이 필요합니다. 아이디어는 첫 번째 비트에 대해 캡처 그룹을 사용한 다음 마지막 비트와 일치 시키려고 할 때이를 다시 참조하는 것입니다.

<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1> 

이 정규식 괄호의 한 쌍을 포함, 문자열이 처음으로 역 참조로 [A-Z][A-Z0-9]* 일치 캡처 : 여기에 (이전에 주어진 링크에서) HTML의 시작과 끝 태그 한 쌍의 일치의 예 . 이 역 참조는 \1 (백 슬래시 1)과 함께 재사용됩니다. / 앞에 오는 것은 단순히 일치하려는 닫는 HTML 태그의 슬래시입니다.

귀하의 경우에이 적용 : (. 예, 브라이언 트집 쟁이가 게시 된 정규식 그냥이 작업을 수행하는 많은 방법이 없습니다.)

/^(.{3}).*\1$/ 

자세한 설명을 후손을 위하여 (당신 아래에 있다면 모욕하지 마십시오) :

  • ^ 라인의 시작과 일치합니다.
  • (.{3}) 모든 유형의 3자를 그룹화하여 나중에 참조 할 수 있도록 그룹에 저장합니다.
  • .*은 최대한 오래 일치합니다. (당신은 라인의 중간에 무슨 상관하지 않습니다.)
  • \1
  • 2.
  • $는 줄의 끝과 일치하는 단계에서 캡처 된 그룹을 일치합니다.
3

는 :

/^(.{3}).*\1$/ 

이것은 backreference이다. 시작 일치를 들어

my $test = 'abcabc'; 
print $test =~ m/^([a-z]{3}).*(\1)$/; 

과 끝 당신은 ^$ 앵커를 추가해야합니다 :

1

이 작동합니다.

관련 문제