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條經驗 獲得超13個贊
您在這里不是在處理常規語言,因此沒有理由淘汰(慢速)正則表達式引擎。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 關注
- 218 瀏覽
添加回答
舉報