2013-05-22 23 views
6

Yalnızca bir örneği yerine hepsi bir regex ile değiştirmek istiyorum. Bunu Go'nun regexp kitaplığında nasıl yapabilirim?Bir veseyi regexp ile değiştirin

girişi: foobar1xfoobar2x
regex: bar(.)x
yedek: baz$1

ReplaceAllString çıkışı: foobaz1foobaz2
ReplaceOneString çıkışı: Genelde foobaz1foobar2x

+0

. Şimdi ne kullanıyorsun? Bu, sizin için dokümanları okumamıza yardımcı olabilir. – Qtax

+0

@Qtax, Go'nun regexp kütüphanesini kullanıyorum ['Regexp.ReplaceAllString'] (http://golang.org/pkg/regexp/#Regexp.ReplaceAllString). ReplaceOneString için eşdeğer bir api mevcut görünmüyor. –

+1

[Aşağıdaki] 'yi (http://regex101.com/r/mX7tN4) bir geçici çözüm olarak deneyebilirsiniz (iyice test etmediniz) – HamZa

cevap

8

, sen başındaki ve sonundaki tembel maç ve kullanım çapa kullanırsanız ilk değişimin yerini alabilirsin:

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

Örnek:

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

Çıktı

foobaz1xfoobar2x 
+0

Neyi yanlış yapıyorum: http://play.golang.org/p/RiIxRIdDWs –

+1

Grup karakter değişkenlerini, aşağıdaki karakterlerle geçerli tanımlayıcı adları yaparlarsa, kıvırcıklaştırmanız gerekir. Güncelleştirilmiş yanıtlara bakın – perreal

+0

(. *) 'uygun bir ikame ile birlikte regex sonuna kadar yeterli olabilir mi? –

0

benim desen çok karmaşık çünkü kabul çözümü kullanabilirsiniz cound't. Ben ReplaceAllStringFunc kullanarak ile sona erdi: API bağlıdır 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) 
}