2013-05-22 28 views
6

Tôi muốn thay thế một cá thể duy nhất bằng regex thay vì tất cả chúng. Tôi sẽ làm thế nào với thư viện regexp của Go?Thay thế một sự kiện với regexp

đầu vào: foobar1xfoobar2x
regex: bar(.)x
thay thế: baz$1

ReplaceAllString đầu ra: foobaz1foobaz2
ReplaceOneString đầu ra: foobaz1foobar2x

+0

đó phụ thuộc vào các API. Bạn đang sử dụng cái gì? Điều này có thể giúp chúng tôi đọc tài liệu cho bạn. – Qtax

+0

@Qtax, tôi đang sử dụng thư viện regexp của Go ['Regexp.ReplaceAllString'] (http://golang.org/pkg/regexp/#Regexp.ReplaceAllString). Một api tương đương cho 'ReplaceOneString' dường như không tồn tại. –

+1

Bạn có thể thử [sau] (http://regex101.com/r/mX7tN4) như một giải pháp (không kiểm tra kỹ lưỡng) – HamZa

Trả lời

8

Nói chung, nếu bạn sử dụng lười biếng trận đấu và sử dụng neo cho đầu và cuối , bạn có thể có hành vi thay thế đầu tiên:

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

Ví dụ:

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

Output

foobaz1xfoobar2x 
+0

Tôi đang làm gì sai: http://play.golang.org/p/RiIxRIdDWs –

+1

bạn cần phải quăn biến nhóm nếu chúng tạo tên định danh hợp lệ với các ký tự sau, xem câu trả lời được cập nhật – perreal

+0

Sẽ không thêm một ' (. *) 'đến cuối của regex cùng với một var thay thế phù hợp là đủ? –

0

tôi cound't sử dụng giải pháp được chấp nhận bởi vì mô hình của tôi là rất phức tạp. tôi đã kết thúc với việc sử dụng 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) 
} 
Các vấn đề liên quan