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

时间:2019-01-09 16:21:31

标签: regex go

我有一个字符串,该字符串可以带有-name,后跟value(可以有空格),并且在它之后也可以有-descr,后跟一个值(-descr,后跟value可能也可能不存在):

示例字符串:

runcmd -name abcd xyz -descr abc def

runcmd -name abcd xyz

使用Go语言,我如何编写regexp,如果存在-descr,它将返回给我字符串。因此,对于以上两个示例,结果应为:

runcmd -name abcd xyz

我正在尝试:

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

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

3 个答案:

答案 0 :(得分:0)

通过“不起作用”,您是说它与任何内容都不匹配,还是与您的期望不符?

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

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

使用这种方法,通常更容易使用两个正则表达式。因此,第一个删除-descr及其后的所有内容,第一个匹配-name和所有后续字符。

答案 1 :(得分:0)

您可以用-name捕获第一部分,然后匹配两者之间的内容,并使用可选的第二捕获组来匹配-descr和随后的内容。

然后,您可以在创建所需结果时使用捕获组。

^(.*? -name\b).*?(-descr\b.*)?$

Regex demo | Go demo

例如:

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

答案 2 :(得分:0)

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

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