2010-01-14 5 views
2

: 그것은 a5a 일치정규식 역 참조

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

를, 또한 등등 a5b, a5c, a5d과 일치 할 수있는 방법이 있습니까?


가 편집 : 좋아, 난 그냥 ([a-z])([0-9])([a-z])를 사용할 수 있다는 것을 이해하지만 매우 길고 복잡한 정규 표현식을했습니다 (일치 서브 서브 서브 -...- 도메인 또는 일치 IPv4 주소는) 실제로 위에서 설명한 동작의 이점을 얻을 수 있습니다. 역 참조 또는 다른 것을 사용하여 달성 할 수 있을까요?


Anon. answer 내가 필요로하는 것이지만 오류가있는 것으로 보입니다.

답변

2

두 번째 문자가 첫 번째 문자와 독립적 인 경우 역 참조가 필요하지 않습니까?

([a-z])([0-9])([a-z])+ 

편집

그냥 다음, 다시 위로 마지막 부분을 반복하지 않으려면 : 그냥 멀리 복용 '+'

([a-z])([0-9])([a-z]) 

.

+0

밀기울 감사하지만 제발 내 편집을 확인하십시오. –

+0

아니요, 마지막 부분을 반복해서 반복 할 필요없이'([a-z]) ([0-9]) ([a-z]) +'를 제공 한 첫 번째 정규식의 효과를 원합니다. –

0

질문을 따르지 않습니까?

[a-z][0-9][a-z] Exactly 1 
[a-z][0-9][a-z]? One or 0 
[a-z][0-9][a-z]+ 1 or more 
[a-z][0-9][a-z]* 0 or more 
+0

제 편집 내용을 확인해 주시겠습니까? 감사. –

2

정규 표현식에서 백 참조의 요점은 지정된 하위 표현식으로 같은 일을 일치하도록, 그래서 그 동작을 비활성화 할 수있는 방법이 없습니다.

원하는 동작을 얻으려면 정규 표현식의 일부를 나중에 재사용 할 수 있도록 다시 사용하려는 정규 표현식 부분을 별도의 문자열로 정의하면됩니다. '에서 일하는) 문자열 보간이나 연결을 사용하여 조각에서 정규 표현식을 작성합니다. 루비 예를 들어

:

>> letter = '([a-z])' 
=> "([a-z])" 
>> /#{letter}([0-9])#{letter}+/ =~ "a5b" 
=> 0 
>> /#{letter}([0-9])#{letter}+/ =~ "a51" 
=> nil 

또는 자바 스크립트 : (그냥 재귀를 위해 아닙니다)

var letter = '([a-z])'; 
var re = new RegExp(letter + '([0-9])' + letter + '+'); 
"a5b".match(re) 
1

난 당신이 펄 (?PARNO) 구조와 유사한 무언가를하고자하고 생각한다. 첫 번째 캡처 그룹에 대한 변경 사항이 무엇 (?1) 경기에 반영됩니다 -

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

은 당신이 원하는 것을 일치합니다.

+0

하지만 내가 찾고있는 정규식은 RegexBuddy (PCRE 및 Perl 모드에서) 오류를 제공합니다. –

+0

내 버전의 Perl에서 작동합니다. –

+0

정규 표현식의'(? 1)'부분은 RegexBuddy에서 Perl 모드로 다음 오류를 제공합니다 : ** 잘못된 문자 (불완전한 정규 표현식 토큰 또는 이스케이프되지 않은 메타 문자) **, 고마워요. =) –

3

대답없는 역 참조

역 참조 이전에 일치 된 값과 일치하는 것을 의미

으로 이다. 이전 식과 일치하는 것은 아닙니다.그러나 언어가 허용하는 경우 문자열을 컴파일하기 전에 문자열의 변수를 표현식으로 대체 할 수 있습니다.

은 Tcl :

set exp1 "([a-z])" 
regexp "${exp1}([0-9])${exp1}+" $string 

자바 스크립트 :

var exp1 = '([a-z])'; 
var regexp = new RegExp(exp1 + '([0-9])' + exp1 + '+'); 
string.match(regexp); 

펄 :

my $exp1 = '([a-z])'; 
$string =~ /${exp1}([0-9])${exp1}+/; 
0

역 참조를 입수 있습니다 데이터를 정규 표현식의 이전 버전에서 가져 와서 나중에 사용합니다. 문체 문제를 해결하기위한 것이 아닙니다. 역 참조를 사용하는 정규식은 정규식이없는 정규식으로 작동하지 않습니다. 반복적이고 추악한 정규식에 익숙해 질 필요가 있습니다.

파이썬을 사용해보십시오. 그러면 작은 블록에서 정규식을 쉽게 만들 수 있습니다. 환경을 바꿀 수 있는지 확실하지 않은 경우 ... 처음부터 역 참조를하면 운이 좋을 것입니다.