当以 .* 开头时,=~ 的正则表达式匹配返回错误的结果

问题描述

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...