码:
package main
import (
"fmt"
"regexp"
)
func main() {
r := regexp.MustCompile(`((.*))`)
s := `(tag)SomeText`
res := r.FindStringSubmatch(s)
fmt.Println(res[1])
}
Run Code Online (Sandbox Code Playgroud)
如何在括号内获得价值?
小智 10
1-虽然使用正则表达式很简单(在Go Go Playground上试试):
package main
import (
"fmt"
"regexp"
)
var rgx = regexp.MustCompile(`\((.*?)\)`)
func main() {
s := `(tag)SomeText`
rs := rgx.FindStringSubmatch(s)
fmt.Println(rs[1])
}
Run Code Online (Sandbox Code Playgroud)
输出:
tag
Run Code Online (Sandbox Code Playgroud)
2-但有时使用strings.Index速度足够快(在The Go Playground上尝试):
package main
import (
"fmt"
"strings"
)
func match(s string) string {
i := strings.Index(s, "(")
if i >= 0 {
j := strings.Index(s[i:], ")")
if j >= 0 {
return s[i+1 : j-i]
}
}
return ""
}
func main() {
s := `(tag)SomeText`
r := match(s)
fmt.Println(r)
}
Run Code Online (Sandbox Code Playgroud)
输出:
tag
Run Code Online (Sandbox Code Playgroud)
3-这个简单的基准测试表明,使用正则表达式需要931毫秒,使用strings.Index需要43毫秒进行1000000次迭代.
package main
import (
"fmt"
"regexp"
"strings"
"time"
)
var rgx = regexp.MustCompile(`\((.*?)\)`)
const n = 1000000
func main() {
var rs []string
var r string
s := `(tag)SomeText`
t := time.Now()
for i := 0; i < n; i++ {
rs = rgx.FindStringSubmatch(s)
}
fmt.Println(time.Since(t))
fmt.Println(rs[1]) // [(tag) tag]
t = time.Now()
for i := 0; i < n; i++ {
r = match(s)
}
fmt.Println(time.Since(t))
fmt.Println(r)
}
func match(s string) string {
i := strings.Index(s, "(")
if i >= 0 {
j := strings.Index(s[i:], ")")
if j >= 0 {
return s[i+1 : j-i]
}
}
return ""
}
Run Code Online (Sandbox Code Playgroud)