2016-09-19 8 views
1

명명 된 캡처 그룹에 문제가있어서 다시 사용하고 있습니다. 마치 캡쳐 그룹 A의 이름을 붙였을 때 "asd"와 같은 것을 캡처하고 \ k를 사용하고 캡쳐 그룹 A의 표현식을 다시 사용하려고 시도하는 것처럼 보입니다. 정규식 I와 일치하지 않기 때문에 다시 작동하지 않습니다. originaly는 A 그룹에 글을 썼지 만, 이전에 "asd"와 일치했던 A와 일치 시키려고합니다.Regex : 다시 캡처 그룹 사용

그래서 내가 좋아하는 뭔가가있는 경우 :

^(?<A>(?:a|s|d))\k<A>$ 

을 그리고 입력 :

캡처 그룹 A가 먼저 편지에 일치하고 \k<A> 이제도를 찾고 있기 때문에, 작동
aa 

에이.

첫 번째로 일치하는 A와 \k<A>이 이제 다른 문자를 찾고 있기 때문에 as으로 입력하면 작동하지 않습니다.

내가 원하는 것은 다시 캡처 그룹 A의 정규식 정규 표현식을 다시 사용하는 것입니다. 그래서 나는 \k<A> = (?:a|s|d)을 원한다.

여기의 문제는 무엇이며이를 해결할 수있는 방법이 있습니까?

감사합니다.

+2

[재귀] (http://www.regular-expressions.info/recurse.html)를 찾고 있습니다. 불행하게도 널리 지원되는 기능은 아닙니다. 나는 posix-ere가 그것을 지원한다고 생각하지 않는다. –

+0

@ Rawing 그래, 맞아. 대신 \ gname을 사용했지만 실제 정규 표현식에 몇 가지 다른 문제가 있지만 모든 것이 제대로 작동합니다. 답변으로 제출하고 나는 당신에게 포인트를 줄 것이다. – Piwwoli

+0

'\ g'name '을 사용할 수 있다면 posix-ere 태그가 잘못되었습니다. 환경이란 무엇입니까? PHP? 루비? –

답변

1

pcre를 사용하면 재귀를 사용할 수 있습니다.
그러나 재귀은 잘못된 것입니다. 함수 호출과 같습니다.

선호하는 방법 :

^
(?&A) 
(?&A) 
$ 
(?(DEFINE)  # Functions 
     (?<A>       # (1 start) 
      (?: a | s | d) 
    )        # (1 end) 
) 

인라인 방법 :

^
(?<A>       # (1 start) 
     (?: a | s | d) 
)        # (1 end) 
(?&A) 
$ 

모두 같은 일에 대해 않습니다. 인라인 방식을 사용하는 경우에도 여전히 함수 호출입니다.
함수 내에서 자신을 호출하면 더 재귀 적입니다.
즉, (?<A>(?:a|b|c)(?&A)*) 및 특별한 보호가 필요합니다.