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 关注
- 104 浏览
添加回答
举报