为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
ibeautiful 2023-06-01 14:15:15
我有一个字符串,可以有一个 -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 如果它存在
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

您可以在一个组中捕获第一部分-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


查看完整回答
反对 回复 2023-06-01
?
墨色风雨

TA贡献1853条经验 获得超6个赞

“不起作用”是指它不匹配任何东西,还是不符合您的期望?

https://regex101.com/通常在测试正则表达式时非常有用。

我不相信有一种简单的方法可以实现你想要的。如果我们可以假设文本之间不包含任何内容,那么事情就会变得简单得多,-name-descr这种-情况下,regex.MustCompile(`-name ([^-]*)`)应该可以工作

对于这种事情,通常使用 2 个正则表达式会更简单明了。所以第一个条带-descr和它后面的任何内容,以及第一个匹配项-name和所有后续字符。


查看完整回答
反对 回复 2023-06-01
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您在这里不是在处理常规语言,因此没有理由淘汰(慢速)正则表达式引擎。strings 包就足够了:


package main


import (

    "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


查看完整回答
反对 回复 2023-06-01
  • 3 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信