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
TA贡献1853条经验 获得超6个赞
“不起作用”是指它不匹配任何东西,还是不符合您的期望?
https://regex101.com/通常在测试正则表达式时非常有用。
我不相信有一种简单的方法可以实现你想要的。如果我们可以假设文本之间不包含任何内容,那么事情就会变得简单得多,-name
在-descr
这种-
情况下,regex.MustCompile(`-name ([^-]*)`)
应该可以工作
对于这种事情,通常使用 2 个正则表达式会更简单明了。所以第一个条带-descr
和它后面的任何内容,以及第一个匹配项-name
和所有后续字符。
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
- 3 回答
- 0 关注
- 158 浏览
添加回答
举报