2013-05-22 16 views
6

Chcę zastąpić tylko jedną instancję wyrażeniem regularnym, a nie wszystkimi. Jak to zrobić z biblioteką Go regexp?Zamień jedno wystąpienie na regexp

wejściowe: foobar1xfoobar2x
regex: bar(.)x
wymiana: baz$1

ReplaceAllString wyjściowa: foobaz1foobaz2
ReplaceOneString wyjściowa: foobaz1foobar2x

+0

To zależy API. Czego teraz używasz? To może nam pomóc w czytaniu dokumentów. – Qtax

+0

@Qtax, używam biblioteki regexp Go ['Regexp.ReplaceAllString'] (http://golang.org/pkg/regexp/#Regexp.ReplaceAllString). Wydaje się, że nie ma odpowiednika api dla 'ReplaceOneString'. –

+1

Możesz spróbować [następującego] (http://regex101.com/r/mX7tN4) jako obejścia (nie przetestowałem go dokładnie) – HamZa

Odpowiedz

8

W ogóle, jeśli używasz leniwe meczu i zastosowania kotew na początku i na końcu , możesz zastąpić pierwsze zachowanie:

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

Przykład:

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) 
} 

Wyjście

foobaz1xfoobar2x 
+0

Co robię źle: http://play.golang.org/p/RiIxRIdDWs –

+1

musisz kręcić zmienne grupy, jeśli tworzą one poprawne nazwy identyfikatorów z następującymi znakami, zobacz zaktualizowaną odpowiedź – perreal

+0

Nie dołączałbym ' (. *) 'do końca regexu wraz z odpowiednim podstawieniem var wystarczy? –

0

cound't używam przyjętego rozwiązania, ponieważ mój wzór był bardzo skomplikowany. skończyło się używając ReplaceAllStringFunc: 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) 
}