以 .* 开头的 =~ returns 的正则表达式匹配错误结果

Regex match of =~ returns wrong result when starts with .*

package main

import "fmt"
import "regexp"

func main() {
    var sep = "=~"
    var filter = "exported_pod=~.*grafana.*"
    matched, _ := regexp.MatchString(sep+`\b`, filter)
    fmt.Println(matched)
}

在上面的代码片段中,我试图 return True 如果 =~ 恰好出现在 filter 字符串中。

无法理解为什么 returning 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, with 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 () 提取该分隔符,并使用它来拆分原始字符串。
看到这个 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 是一个数组,其中包含任何 =~ 之前和之后的部分(正则表达式检测到的分隔符)。