问题描述
package main
import "fmt"
import "regexp"
func main() {
var sep = "=~"
var filter = "exported_pod=~.*grafana.*"
matched,_ := regexp.MatchString(sep+`\b`,filter)
fmt.Println(matched)
}
在上面的代码段中,如果 True
正好出现在 =~
字符串中,我试图返回 filter
。
无法理解为什么它返回 false
。
如果 filter
字符串是 "exported_pod=~grafana.*"
,它会按预期工作,而如果它是 "exported_pod=~.*grafana.*"
,它会失败。请帮助我了解这里出了什么问题。
实际问题是:
围绕 =
、=~
、!=
、!~
拆分字符串。
在上面的例子中,结果应该是[ "exported_pod",".*grafana.*" ]
。
但是对于任何一个列出的分隔符都应该发生这种拆分。
解决方法
来自regex101:
\b
直接在与 \w
(a-z) 匹配的字符和不与 \w
匹配的字符(按任意顺序)之间匹配,不消耗任何字符。
它不能用于将非词与词分开。
所以使用 \b
是行不通的。 (不管事实正则表达式可能不是最适合这种情况)
简单地测试字符串是否包含 =~
(如“How to check if a string contains a substring in Go”)
fmt.Println(strings.Contains(filter,"=~")) // true
看到这个playground example。
package main
import (
"fmt"
"strings"
)
func main() {
var sep = "=~"
var filter = "exported_pod=~.*grafana.*"
matched := strings.Contains(filter,sep)
fmt.Println(matched)
}
如果您需要测试多个分隔符,那么是的,正则表达式可以提供帮助:playground example,使用 regex tested here。
package main
import "fmt"
import "regexp"
func main() {
var filter = "exported_pod=~.*grafana.*"
matched,_ := regexp.MatchString(`[^=!~](=|=~|!=|!~)[^=!~]`,filter)
fmt.Println(matched)
}
使用 regexp with a named capture group:
[^=!~](?P<separator>=|=~|!=|!~)[^=!~]
^^^^^^^^^^^^^
您可以使用 regexp.SubexpIndex
(Go 1.15+,Aug. 2020) 提取该分隔符,并使用它来拆分原始字符串。
请参阅此playground example:
package main
import "fmt"
import "regexp"
import "strings"
func main() {
var filter = "exported_pod=~.*grafana.*"
re := regexp.MustCompile(`[^=!~](?P<separator>=|=~|!=|!~)[^=!~]`)
matches := re.FindStringSubmatch(filter)
separator := matches[re.SubexpIndex("separator")]
filtered := strings.Split(filter,separator)
fmt.Println(filtered)
}
filtered
是一个数组,在任何 =~
之前和之后都有部分(正则表达式检测到的分隔符)。