2012-11-11 3 views
7

다른 정규식 문자열에서 명명 된 캡처 그룹을 찾으려면 정규식을 찾고 있습니다.정규식 Go 프로그래밍 언어로 명명 된 캡처 그룹을 찾으려면

예 :

var subGroups string = `(\(.+\))*?` 
var prefixedSubGroups string = `.+` + subGroups 
var postfixedSubGroups string = subGroups + `.+` 
var surroundedSubGroups string = `.+` + subGroups + `.+` 
var capturingGroupNameRegex *regexp.RichRegexp = regexp.MustCompile(
    `(?U)` + 
    `\(\?P<.+>` + 
    `(` + prefixedSubGroups + `|` + postfixedSubGroups + `|` + surroundedSubGroups + `)` + 
    `\)`) 

?U 욕심 한정사한다 : 나는 명명 된 캡처 그룹을 찾으려면 다음 정규식을 시도

/(?P<country>m((a|b).+)n)/(?P<city>.+)/(?P<street>(5|6)\. .+) 

: 나는 다음과 같은 정규 표현식에서 (?P<country>m((a|b).+)n), (?P<city>.+)(?P<street>(5|6)\. .+)를 찾으려면 ( +*) 비 탐욕적이고 비 탐욕적 한정 기호 ( *?)는 탐욕 스럽습니다. Go regex documentation의 세부 정보

그러나 괄호가 올바르게 일치하지 않아 작동하지 않습니다.

답변

6

임의의 (재귀 적) 중첩을 일반 언어로 설명 할 수 없기 때문에 임의로 중첩 된 괄호를 올바르게 일치시킬 수 없습니다.

일부 현대 정규식 맛 지원 재귀 (펄, PCRE) 또는 균형 일치 (.NET)을 할 수 있지만, 이동은 (펄의 (?R) 구조가 RE2 library that Go's regex package appears to be based on에서 지원하지 않는 the docs explicitly say) 그들 중 하나가 아닙니다. regex가 아닌 재귀 적 파생 파서를 만들어야합니다.

+2

명확히하기 : Go "regexp"패키지는 RE2 라이브러리를 사용하지 않습니다. – zzzz

+1

그것은 - 다만 연결을 따른다 – mvp

+0

좋아, 실제로 그 도서관을 이용하지 않는다, 그러나 동일한 신의장을 받아 들인다. –

관련 문제