3 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以在一個(gè)組中捕獲第一部分-name
,然后匹配中間的部分并使用可選的第二個(gè)捕獲組來(lái)匹配-descr
和后面的內(nèi)容。
然后您可以在創(chuàng)建所需結(jié)果時(shí)使用捕獲組。
^(.*? -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])
結(jié)果:
runcmd -name...-descr abc def

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
“不起作用”是指它不匹配任何東西,還是不符合您的期望?
https://regex101.com/通常在測(cè)試正則表達(dá)式時(shí)非常有用。
我不相信有一種簡(jiǎn)單的方法可以實(shí)現(xiàn)你想要的。如果我們可以假設(shè)文本之間不包含任何內(nèi)容,那么事情就會(huì)變得簡(jiǎn)單得多,-name
在-descr
這種-
情況下,regex.MustCompile(`-name ([^-]*)`)
應(yīng)該可以工作
對(duì)于這種事情,通常使用 2 個(gè)正則表達(dá)式會(huì)更簡(jiǎn)單明了。所以第一個(gè)條帶-descr
和它后面的任何內(nèi)容,以及第一個(gè)匹配項(xiàng)-name
和所有后續(xù)字符。

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
您在這里不是在處理常規(guī)語(yǔ)言,因此沒(méi)有理由淘汰(慢速)正則表達(dá)式引擎。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"
// ""
在操場(chǎng)上試試:https ://play.golang.org/p/RFC65CYe6mp
- 3 回答
- 0 關(guān)注
- 214 瀏覽
添加回答
舉報(bào)