2011-09-11 5 views
2

이전에 동일한 RexExp에 나타난 그룹 정의를 반복 할 수있는 RegExps 구문이 있습니까? 참고 : 그룹 정의를 다시 '복사'하고 싶습니다. 이전 그룹의 일치에 대한 역 참조에 관심이 없습니다 (즉, '\ n'은 내가 찾고있는 것이 아닙니다).RegExp (PCRE 또는 Emacs) : 이전에 정의 된 그룹 반복

예 : "spamniceggs", "eggswithspam", "spamlovelyspam", "eggeggspam"과 일치하지만 "spamwithham"이나 "deliciousegg"와 일치하지 않는 RegExp를 찾습니다.

가능한 PCRE RegExp는 다음과 같습니다. ((?: spam) | (? : egg)) \ w * ((?: egg) | (스팸)) 이 경우와 비슷한 경우 동일한 그룹 설명 (DRY)의 명시 적 반복을 피하기에 좋다. 그래서 나는 다음과 같이 의미 론적 인 가상 연산자 "~ n"을 찾고 있습니다 : 적용은 n 번째 캡처 그룹과 동일한 그룹 설명을 다시 적용합니다. 따라서 예제 RegExp는 다음과 같이 표현 될 수 있습니다. (? :(?: 스팸) | (? : egg)) \ w * ~ 1

이 줄을 따라 어떤 것을 얻을 수있는 방법이 있습니까? 정규식 구현의 중 하나에서 이런 일에 대한 설비는 약이맥스을 요구하고 있지만, 주변의 언어가 쉽게 충분하게이 없습니다

+0

Perl에서 qr //와 같은 것을 의미합니까? –

답변

5

. Lisp의 경우 :

(let* (s "spam") 
     (e "egg") 
     (sore (concat "\\(" s "\\|" e "\\)")) 
     (regex (concat sore "[A-Za-z]*" sore))) 
    (... do stuff with regex ...) 

C에서 마찬가지로 정규식을 문자열로 만들 수 있습니다. sprintf.

편집 : PCRE에서 간과 한 ?(DEFINE). 나는 Emacs/일반적인 경우에 이것을 남겨두고있다.

4

만약 qr //와 같은 것을 의미한다면, PCRE는 없습니까? (DEFINE)와 (? &)를 사용하십시오. 그것들은 Perl 5.10에서 PCRE로 복사 된 기능입니다. IP 주소 예 :

(?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d)) 
     \b (?&byte) (\.(?&byte)){3} \b 
관련 문제