我有一个字符串,该字符串可以带有-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的字符串
答案 0 :(得分:0)
通过“不起作用”,您是说它与任何内容都不匹配,还是与您的期望不符?
https://regex101.com/通常在测试正则表达式时非常有用。
我不认为有一种简单的方法可以实现您想要的。如果我们假设-name
和-descr
之间的文本不包含任何-
,事情就会变得简单得多,在这种情况下,regex.MustCompile(`-name ([^-]*)`)
应该可以工作
使用这种方法,通常更容易使用两个正则表达式。因此,第一个删除-descr
及其后的所有内容,第一个匹配-name
和所有后续字符。
答案 1 :(得分:0)
您可以用-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
答案 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"
// ""