golang的正则表达式库是个半成品,不支持复杂正则和预查等功能,可以使用三方优化的库regexp2,安装:
go get -u github.com/dlclark/regexp2
使用:大致上与regexp相同
m, _ := regexp2.MustCompile(`(?<=aaa).*?(?=ccc)`, 0).FindStringMatch("aaabbbccc")
fmt.Println(m.String())
regexp与regexp2差异:
Category |
regexp | regexp2 |
---|---|---|
Catastrophic backtracking possible | no, constant execution time guarantees | yes, if your pattern is at risk you can use the re.MatchTimeout field |
Python-style capture groups (?P<name>re) |
yes | no (yes in RE2 compat mode) |
.NET-style capture groups (?<name>re) or (?'name're) |
no | yes |
comments (?#comment) |
no | yes |
branch numbering reset (?|a|b) |
no | no |
possessive match (?>re) |
no | yes |
positive lookahead (?=re) |
no | yes |
negative lookahead (?!re) |
no | yes |
positive lookbehind (?<=re) |
no | yes |
negative lookbehind (?<!re) |
no | yes |
back reference \1 |
no | yes |
named back reference \k'name' |
no | yes |
named ascii character class [[:foo:]] |
yes | no (yes in RE2 compat mode) |
conditionals (?(expr)yes|no) |
no | yes |