Golang正则表达式在括号内得到值

Cha*_*ali 4 regex go

码:

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)

  • 匹配函数在返回中有一个错字 - 它在运行时产生切片边界超出范围错误。它应该是 return s[i+1 : **j+i**] `func match(s string) string { i := strings.Index(s, "(") if i &gt;= 0 { j := strings .Index(s[i:], ")") 如果 j &gt;= 0 { return s[i+1 : j+i] } } return "" }` (2认同)