4 回答

TA貢獻1995條經驗 獲得超2個贊
只需用一句話重新發布@mkopriva 的片段之一,
并非所有事情都需要使用正則表達式來完成:
s := "abcd_1.263.0.15-8zz00df.yml"
if i := strings.IndexByte(s, '_'); i > -1 {
s = s[i+1:]
}
if i := strings.LastIndexByte(s, '.'); i > -1 {
s = s[:i]
}
fmt.Println(s)

TA貢獻1815條經驗 獲得超10個贊
對于該字符串格式的更精確匹配,您可以使用捕獲組,并且由于字符串中似乎沒有空格,您可以使用\S
而不是.
_(\S+)\.yml$
_
匹配前導下劃線(\S+)
在第 1 組中捕獲 1+ 個非空白字符\.yml
匹配.yml
$
字符串結束
查看正則表達式演示。
例如
package main
import (
"fmt"
"regexp"
)
func main(){
re := regexp.MustCompile(`_(\S+)\.yml$`)
res := re.FindStringSubmatch("abcd_1.263.0.15-8zz00df.yml")
fmt.Printf("%v", res[1])
}
輸出
1.263.0.15-8zz00df
或者更廣泛的匹配,捕獲到最后一次出現點之前:
_(\S+)\.
查看另一個正則表達式演示。

TA貢獻1789條經驗 獲得超10個贊
編輯:您可以簡單地使用正則表達式:
_(.*)\.
貪婪匹配,這*
意味著它將匹配所有內容,直到最后一個 '.' - 這正是你所需要的。您的比賽在第 1 組。
你為什么使用\K
匹配器?你的正則表達式是這樣工作的:
_(.*)(?=\.)
第 1 組包含您的比賽。
注意:測試正則表達式的一個非常有用的工具是這個站點:https ://regexr.com/
- 4 回答
- 0 關注
- 145 瀏覽
添加回答
舉報