-1
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.*" ]。但是对于列出的任何一个
分隔符 都应该发生这种拆分。

4

1 回答 1

2

regex101

\b立即匹配由\w(az) 匹配的字符和不匹配的字符\w(以任一顺序),而不消耗任何字符。
它不能用于将非单词与单词分开。

所以使用\b是行不通的。(不管事实正则表达式可能不是最适合这种情况)

简单地测试字符串是否包含=~(如“如何检查字符串是否包含 Go 中的子字符串”)

fmt.Println(strings.Contains(filter, "=~")) // true

请参阅这个操场示例

package main

import (
    "fmt"
    "strings"
)

func main() {
    var sep = "=~"
    var filter = "exported_pod=~.*grafana.*"
    matched := strings.Contains(filter, sep)
    fmt.Println(matched)
}

如果您需要测试多个分隔符,那么是的,正则表达式可以提供帮助:操场示例此处测试正则表达式

package main

import "fmt"
import "regexp"

func main() {
    var filter = "exported_pod=~.*grafana.*"
    matched, _ := regexp.MatchString(`[^=!~](=|=~|!=|!~)[^=!~]`, filter)
    fmt.Println(matched)
}

使用带有命名捕获组的正则表达式:

[^=!~](?P<separator>=|=~|!=|!~)[^=!~]
       ^^^^^^^^^^^^^

regexp.SubexpIndex您可以使用( Go 1.15+, Aug. 2020 )提取该分隔符,并使用它来拆分原始字符串。
请参阅此操场示例

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是一个数组,在 any 之前和之后都有部分=~(正则表达式检测到的分隔符)。

于 2021-05-25T06:49:57.090 回答