我正在提取${}中的数据。例如,从这个字符串中提取的数据应该是abc。
${}
abc
git commit -m '${abc}'
下面是实际代码:
re := regexp.MustCompile("${*}") match := re.FindStringSubmatch(command)
但这行不通,你知道吗?
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("\\$\\{(.*?)\\}")
2ekbmq322#
试试re:= regexp.MustCompile(\$\{(.*)\}) * 是一个量词,你需要一些东西来量化。.可以匹配所有内容。
regexp.MustCompile(\$\{(.*)\})
.
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
nxagd54h4#
对于另一种方法,您可以使用os.Expand:
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
nqwrtyyt5#
因为$、{和}在正则表达式中都有特殊的含义,需要用反斜杠来匹配这些文字字符,因为*不是这样工作的,而且因为你实际上没有为你想要捕获的数据包括一个捕获组。尝试:
*
re := regexp.MustCompile(`\$\{.+?)\}`)
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
6条答案
按热度按时间a2mppw5e1#
在正则表达式中,
$
、{
和}
具有特殊含义所以你需要在正则表达式中转义它们。由于这样的原因,在使用正则表达式时,最好使用原始字符串字面量:
Golang Demo
对于双引号(解释的字符串字面量),您还需要转义反斜杠:
2ekbmq322#
试试re:=
regexp.MustCompile(\$\{(.*)\})
* 是一个量词,你需要一些东西来量化。.
可以匹配所有内容。s8vozzvw3#
你也可以试试这个
GoPlay:https://play.golang.org/p/PFH2oDzNIEi
nxagd54h4#
对于另一种方法,您可以使用
os.Expand
:https://golang.org/pkg/os#Expand
nqwrtyyt5#
因为
$
、{
和}
在正则表达式中都有特殊的含义,需要用反斜杠来匹配这些文字字符,因为*
不是这样工作的,而且因为你实际上没有为你想要捕获的数据包括一个捕获组。尝试:3pmvbmvn6#
可以使用命名组提取字符串的值。
GoPlay