为什么Regexp.ReplaceAllString对替换字符串中的某些字符进行转义



使用以下代码:

package main
import (
"regexp"
)
var namedMatch = regexp.MustCompile("\{([^}]+)\}")
func main() {
example := regexp.QuoteMeta("/book/{author-id}/{book-id}")
new_path := namedMatch.ReplaceAllString(example, `(?P<$1>[^/]+)`)
regexp.MustCompile(new_path)
}

游乐场

我们得到以下恐慌:

panic: regexp: Compile(`/book/(?P<author-id>[^/]+)/(?P<book-id>[^/]+)`): error parsing regexp: unexpected ): `/book/(?P<author-id>[^/]+)/(?P<book-id>[^/]+)`
goroutine 1 [running]:
regexp.MustCompile(0xc000110040, 0x31, 0x1f)
/usr/local/go-faketime/src/regexp/regexp.go:311 +0x157
main.main()
/tmp/sandbox229373954/prog.go:13 +0x8b

为什么替换字符串(?P<author-id>[^/]+)(?P<book-id>[^/]+)会像这样转义?Regexp不应该按原样放置字符串吗?我该如何解决这个问题,以便在替换中有一个有效的正则表达式?

多亏了@zerkms,才发现regexp是错误的。代替:

var namedMatch = regexp.MustCompile("\{([^}]+)\}")

应该是:

var namedMatch = regexp.MustCompile("\\{([^}]+)\\}")

因此regexp将正确地替换转义的花键。

最新更新