【发布时间】:2022-01-07 06:55:24
【问题描述】:
我正在尝试创建一个正则表达式来解析特定的字符串。
当前字符串是abcd_1.263.0.15-8zz00df.yml,我只想从中解析出1.263.0.15-8zz00df。
已尝试使用此表达式 "_\K.*(?=\.)",但它在 Golan 中不起作用并给我模式错误。有人可以帮忙吗?
【问题讨论】:
标签: regex go regex-group
我正在尝试创建一个正则表达式来解析特定的字符串。
当前字符串是abcd_1.263.0.15-8zz00df.yml,我只想从中解析出1.263.0.15-8zz00df。
已尝试使用此表达式 "_\K.*(?=\.)",但它在 Golan 中不起作用并给我模式错误。有人可以帮忙吗?
【问题讨论】:
标签: regex go regex-group
Go 使用 RE2 正则表达式引擎,不支持 lookaheads、lookbehinds 和其他 PCRE 好东西,例如 \K
查看不同正则表达式引擎的comparison。
但是你可以使用这个正则表达式:
[^_-]+-[^.]+
看到这个demo。
解释:
[^_-]+ # a character that is not "_" or "-", one or more times
- # a literal "-"
[^.]+ # a character that is not a dot, one or more times
【讨论】:
只是用一句话转发@mkopriva 的一个sn-ps,
并非所有事情都需要使用正则表达式来完成:
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)
【讨论】:
编辑:您可以简单地使用正则表达式:
_(.*)\.
* 贪婪匹配,这意味着它将匹配所有内容,直到最后一个 '.' - 这正是你所需要的。您的比赛在第 1 组。
您为什么使用\K 匹配器?你的正则表达式是这样工作的:
_(.*)(?=\.)
第 1 组包含您的匹配项。
注意:测试正则表达式的一个非常有用的工具是这个站点:https://regexr.com/
【讨论】:
为了更精确地匹配该字符串格式,您可以使用捕获组,并且由于字符串中似乎没有空格,您可以使用\S 而不是.
_(\S+)\.yml$
_ 匹配前导下划线(\S+) 在第 1 组中捕获 1+ 个非空白字符\.yml匹配.yml
$ 字符串结束查看regex demo。
例如
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+)\.
查看另一个regex demo。
【讨论】: