2013-05-22 5 views
6

오직 하나의 인스턴스를 모두 정규 표현식으로 바꾸고 싶습니다. Go의 regexp 라이브러리를 사용하면 어떻게됩니까?하나의 어커런스를 regexp로 바꾸기

입력 : foobar1xfoobar2x
정규식 : bar(.)x
교체 : baz$1

ReplaceAllString 출력 : foobaz1foobaz2
ReplaceOneString 출력 : 일반적으로 foobaz1foobar2x

+0

. 지금 무엇을 사용하고 계십니까? 이는 귀하를 위해 문서를 읽는 데 도움이 될 수 있습니다. – Qtax

+0

@Qtax, Go의 regexp 라이브러리 ['Regexp.ReplaceAllString'] (http://golang.org/pkg/regexp/#Regexp.ReplaceAllString)를 사용하고 있습니다. 'ReplaceOneString'에 해당하는 api가 존재하지 않는 것 같습니다. –

+1

해결 방법으로 [다음] (http://regex101.com/r/mX7tN4)을 시도해 볼 수 있습니다 (철저히 테스트하지 않았습니다). – HamZa

답변

8

, 당신은 시작과 끝을 위해 게으른 경기 및 사용 앵커를 사용하는 경우 첫 번째 동작을 바꿀 수 있습니다.

replace `^(.*?)bar(.*)$` with `$1baz$2`. 

예 :

package main 

import (
    "fmt" 
    "regexp" 
) 

func main() { 
    src := "foobar1xfoobar2x" 
    pat := regexp.MustCompile("^(.*?)bar(.*)$") 
     repl := "${1}baz$2" 
    output := pat.ReplaceAllString(src, repl) 
    fmt.Println(output) 
} 

출력

foobaz1xfoobar2x 
+0

내가 잘못하고있는 것 : http://play.golang.org/p/RiIRIRIdDWs –

+1

다음의 문자로 유효한 식별자 이름을 만들면 그룹 변수를 곱슬 곱슬 할 필요가있다. 업데이트 된 대답을 보자. – perreal

+0

' (. *)'적절한 대체와 함께 정규식의 끝에 var 충분하다? –

0

내 패턴이 매우 복잡했기 때문에 내가 허용 솔루션을 사용 cound't. 내가 ReplaceAllStringFunc를 사용하여 결국 : 이 API에 따라 https://play.golang.org/p/ihtuIU-WEYG

package main 

import (
    "fmt" 
    "regexp" 
) 

var pat = regexp.MustCompile("bar(.)(x)") 

func main() { 
    src := "foobar1xfoobar2x" 
    flag := false 
    output := pat.ReplaceAllStringFunc(src, func(a string) string { 
     if flag { 
      return a 
     } 
     flag = true 
     return pat.ReplaceAllString(a, "baz$1$2") 
    }) 
    fmt.Println(output) 
} 
관련 문제