使用Golang正则表达式获取括号内的值

16

代码:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    r := regexp.MustCompile(`((.*))`)
    s := `(tag)SomeText`

    res := r.FindStringSubmatch(s)
    fmt.Println(res[1])
}

如何获取括号内的值?

3个回答

29

1- 虽然使用正则表达式很简单(可以在Go Playground上尝试),

package main

import (
    "fmt"
    "regexp"
)

var rgx = regexp.MustCompile(`\((.*?)\)`)

func main() {
    s := `(tag)SomeText`
    rs := rgx.FindStringSubmatch(s)
    fmt.Println(rs[1])
}

输出:

tag

2- 但有时候使用 strings.Index 已经足够快了(在 Go Playground 上尝试一下即可):

package main

import (
    "fmt"
    "strings"
)

func match(s string) string {
    i := strings.Index(s, "(")
    if i >= 0 {
        j := strings.Index(s, ")")
        if j >= 0 {
            return s[i+1 : j]
        }
    }
    return ""
}

func main() {
    s := `Some(tag)Text`
    r := match(s)
    fmt.Println(r)

}

输出:

tag

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, ")")
        if j >= 0 {
            return s[i+1 : j]
        }
    }
    return ""
}

嘿,谢谢。对于我的程序来说,执行速度确实非常重要 :) - Chali
2
match函数的返回值存在一个拼写错误 - 它会在运行时产生一个切片越界错误。应该是return s[i+1 : j+i] 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 "" } - Matt

1

我通过这个正则表达式解决了我的问题

r := regexp.MustCompile(`\((.*?)\)`)

0
参考答案,我制作了自己的代码版本。 链接:https://play.golang.org/p/b82iPZGU1gw
package main

import (
    "fmt"
    "strings"
)

func match(start, end, s string) string {
    i := strings.Index(s, start)
    if i >= 0 {
        j := strings.Index(s[i:], end)
        if j >= 0 {
            return s[i+len(start) : i+j]
        }
    }
    return ""
}

func main() {
    errText := `facebook: Error validating access token: Session has expired on Tuesday, 28-Jul-20 22:00:00 PDT. The current time is Wednesday, 29-Jul-20 17:55:22 PDT. (code: 190; error_subcode: 463, error_user_title: , error_user_msg: )`
    start := "code: "
    end := ";"
    r := match(start, end, errText)
    fmt.Println(r)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接