2013-05-22 17 views
6

1つのインスタンスだけをすべてではなく正規表現に置きたいと思います。 Goのregexpライブラリでどうすればいいですか?1つの出現箇所を正規表現に置き換えます

入力: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/RiIxRIdDWs –

+1

グループ変数を有効にするには、次の文字で識別名を使用する必要があります。更新された回答を参照してください。 – perreal

+0

' (。*) '適切な置換と一緒に正規表現の末尾に十分なのでしょうか? –

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) 
} 
関連する問題