Golang 中的正则表达式问题
Issue with regex in Golang
我正在尝试创建一个正则表达式来解析特定字符串。
当前字符串是 abcd_1.263.0.15-8zz00df.yml
,我只想从中解析 1.263.0.15-8zz00df
。
已经尝试使用此表达式 "_\K.*(?=\.)"
但它在 Golan 中不起作用并且给我模式错误。有人可以帮忙吗?
编辑: 您可以简单地使用正则表达式:
_(.*)\.
*
是贪婪匹配的,也就是说它会匹配所有的东西,直到最后一个'.'。 - 这正是您所需要的。你的比赛在第 1 组。
为什么要使用 \K
匹配器?您的正则表达式是这样工作的:
_(.*)(?=\.)
第 1 组包含您的比赛。
注意:测试正则表达式的一个非常有用的工具是这个站点:https://regexr.com/
只是用一句话重新发布@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)
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
为了更精确地匹配该字符串格式,您可以使用捕获组,并且由于字符串中似乎没有空格,您可以使用 \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。
我正在尝试创建一个正则表达式来解析特定字符串。
当前字符串是 abcd_1.263.0.15-8zz00df.yml
,我只想从中解析 1.263.0.15-8zz00df
。
已经尝试使用此表达式 "_\K.*(?=\.)"
但它在 Golan 中不起作用并且给我模式错误。有人可以帮忙吗?
编辑: 您可以简单地使用正则表达式:
_(.*)\.
*
是贪婪匹配的,也就是说它会匹配所有的东西,直到最后一个'.'。 - 这正是您所需要的。你的比赛在第 1 组。
为什么要使用 \K
匹配器?您的正则表达式是这样工作的:
_(.*)(?=\.)
第 1 组包含您的比赛。
注意:测试正则表达式的一个非常有用的工具是这个站点:https://regexr.com/
只是用一句话重新发布@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)
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
为了更精确地匹配该字符串格式,您可以使用捕获组,并且由于字符串中似乎没有空格,您可以使用 \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。