Golang:使用Regex提取数据

zphenhs4  于 2023-05-11  发布在  Go
关注(0)|答案(6)|浏览(122)

我正在提取${}中的数据。
例如,从这个字符串中提取的数据应该是abc

git commit -m '${abc}'

下面是实际代码:

re := regexp.MustCompile("${*}")
match := re.FindStringSubmatch(command)

但这行不通,你知道吗?

a2mppw5e

a2mppw5e1#

在正则表达式中,${}具有特殊含义

$ <-- End of string
{} <-- Contains the range. e.g. a{1,2}

所以你需要在正则表达式中转义它们。由于这样的原因,在使用正则表达式时,最好使用原始字符串字面量:

re := regexp.MustCompile(`\$\{([^}]*)\}`)
match := re.FindStringSubmatch("git commit -m '${abc}'")
fmt.Println(match[1])

Golang Demo

对于双引号(解释的字符串字面量),您还需要转义反斜杠:

re := regexp.MustCompile("\\$\\{(.*?)\\}")
2ekbmq32

2ekbmq322#

试试re:= regexp.MustCompile(\$\{(.*)\}) * 是一个量词,你需要一些东西来量化。.可以匹配所有内容。

s8vozzvw

s8vozzvw3#

你也可以试试这个

re := regexp.MustCompile("\\$\\{(.*?)\\}")

str := "git commit -m '${abc}'"
res := re.FindAllStringSubmatch(str, 1)
for i := range res {
    //like Java: match.group(1)
    fmt.Println("Message :", res[i][1])
}

GoPlay:https://play.golang.org/p/PFH2oDzNIEi

nxagd54h

nxagd54h4#

对于另一种方法,您可以使用os.Expand

package main
import "os"

func main() {
   command := "git commit -m '${abc}'"
   var match string
   os.Expand(command, func(s string) string {
      match = s
      return ""
   })
   println(match == "abc")
}

https://golang.org/pkg/os#Expand

nqwrtyyt

nqwrtyyt5#

因为${}在正则表达式中都有特殊的含义,需要用反斜杠来匹配这些文字字符,因为*不是这样工作的,而且因为你实际上没有为你想要捕获的数据包括一个捕获组。尝试:

re := regexp.MustCompile(`\$\{.+?)\}`)
3pmvbmvn

3pmvbmvn6#

可以使用命名组提取字符串的值。

import (
    "fmt"
    "regexp"
)

func main() {
    command := "git commit -m '${abc}'"

    r := regexp.MustCompile(`\$\{(?P<text>\w+)\}`)
    subMatch := r.FindStringSubmatch(command)

    fmt.Printf("text : %s", subMatch[1])
}

GoPlay

相关问题