Golang 正则表达式匹配字符串直到给定的字符序列

我有一个字符串,可以有一个 -name 后跟值(可以有空格),也可以有 -descr 后跟一个值(-descr 后跟值可能不存在):

示例字符串:

runcmd -name abcd xyz -descr abc def

或者

runcmd -name abcd xyz

使用 Go 语言,我该如何编写正则表达式,它会返回 -descr 之前的字符串(如果它存在)。所以,对于上面的两个例子,结果应该是:

runcmd -name abcd xyz

我在尝试:

regexp.MustCompile(`(-name ).+?=-descr`)

但是,那没有返回任何匹配项。我想知道正确的正则表达式来获取字符串直到 -descr 如果它存在


ibeautiful
浏览 159回答 3
3回答

蝴蝶刀刀

您可以在一个组中捕获第一部分-name,然后匹配中间的部分并使用可选的第二个捕获组来匹配-descr和后面的内容。然后您可以在创建所需结果时使用捕获组。^(.*? -name\b).*?(-descr\b.*)?$正则表达式演示| 去演示例如:s := "runcmd -name abcd xyz -descr abc def" re1 := regexp.MustCompile(`^(.*? -name\b).*?(-descr\b.*)?$`) result := re1.FindStringSubmatch(s) fmt.Printf(result[1] + "..." + result[2])结果:runcmd -name...-descr abc def

墨色风雨

“不起作用”是指它不匹配任何东西,还是不符合您的期望?https://regex101.com/通常在测试正则表达式时非常有用。我不相信有一种简单的方法可以实现你想要的。如果我们可以假设文本之间不包含任何内容,那么事情就会变得简单得多,-name在-descr这种-情况下,regex.MustCompile(`-name ([^-]*)`)应该可以工作对于这种事情,通常使用 2 个正则表达式会更简单明了。所以第一个条带-descr和它后面的任何内容,以及第一个匹配项-name和所有后续字符。

红颜莎娜

您在这里不是在处理常规语言,因此没有理由淘汰(慢速)正则表达式引擎。strings 包就足够了:package mainimport (    "fmt"    "strings"    "unicode")func main() {    fmt.Printf("%q\n", f("runcmd -name abcd xyz -descr abc def"))    fmt.Printf("%q\n", f("runcmd -name abcd xyz"))    fmt.Printf("%q\n", f("-descr abc def"))}func f(s string) string {    if n := strings.Index(s, "-descr"); n >= 0 {        return strings.TrimRightFunc(s[:n], unicode.IsSpace)    }    return s}// Output:// "runcmd -name abcd xyz"// "runcmd -name abcd xyz"// ""在操场上试试:https ://play.golang.org/p/RFC65CYe6mp
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go