2013-12-23 2 views
23

저는 파이썬에서 왔기 때문에 올바른 방법을 찾고있는 것이 아닙니다. 상당히 복잡한 정규 표현식을 만들고 필드 일치 이름에 액세스 할 수 있어야합니다. 좋은 예를 찾을 수없는 것 같습니다. 가장 가까운 것은 다음과 같습니다.Go 정규식의 명명 된 일치 사용

package main 

import (
    "fmt" 
    "regexp" 
) 

var myExp = regexp.MustCompile(`(?P<first>\d+)\.(\d+).(?P<second>\d+)`) 

func main() { 
    fmt.Printf("%+v", myExp.FindStringSubmatch("1234.5678.9")) 

    match := myExp.FindStringSubmatch("1234.5678.9") 
    for i, name := range myExp.SubexpNames() { 
     fmt.Printf("'%s'\t %d -> %s\n", name, i, match[i]) 
    } 
    //fmt.Printf("by name: %s %s\n", match["first"], match["second"]) 
} 

주석 처리 된 행은 파이썬에서 명명 된 필드에 액세스하는 방법입니다. 이 작업을 수행하는 동일한 방법은 무엇입니까? 또는 일치 항목을지도로 변환해야하는 경우지도를 만들고 이동하는 데 가장 관용적 인 방법은 무엇입니까? 다음과 같이

+0

첫 번째 제안 된 답변에 아래에 설명을 추가 할 수 없기 때문에지도를 작성하는 데 엄청난 양의 코드가 필요합니다. 지도에서 값에 액세스하는 방법을 보여주기 위해 답을 편집하시는 것이 좋습니다. 예 : \t 결과 : = myExp.FindStringSubmatchMap ("1234.5678.9") \t fmt.Printf ("% s \ n", 결과 [ "second"]) –

+0

'FindStringSubmatchMap'라는 메서드가 없습니다. – chmike

답변

32

당신은 map을 이용하여 명명 된 캡처 그룹을 참조 할 수 있습니다 : 내가 그렇게 언급이가이어야한다 경우에 저를 용서 명성이없는

package main 

import (
    "fmt" 
    "regexp" 
) 

var myExp = regexp.MustCompile(`(?P<first>\d+)\.(\d+).(?P<second>\d+)`) 

func main() { 
    match := myExp.FindStringSubmatch("1234.5678.9") 
    result := make(map[string]string) 
    for i, name := range myExp.SubexpNames() { 
     if i != 0 && name != "" { 
      result[name] = match[i] 
     } 
    } 
    fmt.Printf("by name: %s %s\n", result["first"], result["second"]) 
} 

GoPlay

+0

http://play.golang.org/p/n3NRgA_Bgs >> panic : 런타임 오류 : 인덱스가 범위를 벗어났습니다. –

+0

잘못된 입력을 사용하고 있습니다. – hwnd

+0

맞아! 나는 그저 그런 것을하려고했다. :) >> https://github.com/qeremy/couch-go/blob/master/src/couch/util/util.go#L105 –

2

'대답'하지만 위의 답은 도움이 되었기 때문에 함수에 넣었습니다.

func reSubMatchMap(r *regexp.Regexp, str string) (map[string]string) { 
    match := r.FindStringSubmatch(str) 
    subMatchMap := make(map[string]string) 
    for i, name := range r.SubexpNames() { 
     if i != 0 { 
      subMatchMap[name] = match[i] 
     } 
    } 
return subMatchMap 
} 

운동장에서의 사용 예 : https://play.golang.org/p/zpLJe0iFwJ

희망이 다른 사람에게 유용합니다. Go에서 명명 된 캡처 그룹의 용이함을 좋아하십시오.

관련 문제