【问题标题】:Regex match of =~ returns wrong result when starts with .*以 .* 开头时 =~ 的正则表达式匹配返回错误结果
【发布时间】:2021-08-13 08:33:53
【问题描述】:
package main

import "fmt"
import "regexp"

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

在上面的 sn-p 中,如果 =~ 恰好出现在 filter 字符串中,我会尝试返回 True

无法理解为什么它会返回 false

如果filter 字符串是"exported_pod=~grafana.*",它会按预期工作,而如果它是"exported_pod=~.*grafana.*",它会失败。请帮助我了解这里出了什么问题。


实际问题是:

将字符串拆分为==~!=!~

在上面的例子中,结果应该是[ "exported_pod", ".*grafana.*" ]
但这种拆分应该发生在任何一个列出的分隔符​​上。

【问题讨论】:

  • 如果您正在寻找文字 "=~" 使用 strings.Contains 而不是正则表达式。
  • @Volker 在可以正则表达式或非正则表达式的字符串中测试 =、=~、!=、!~ 的最佳方法应该是什么?如果我使用 string.contains("=") 问题是它会匹配这样的字符串以及exported_pod=~.*grafana.*"。(注意~这里)。
  • 我承认我不知道你的实际问题是什么。什么是“可以正则表达式或非正则表达式的字符串”。如果您想查看一个字符串是否包含 = 后面没有 ~ 并且前面没有 !您可以使用正则表达式或直接将其编码(这可能更简单)。

标签: regex go gofmt


【解决方案1】:

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

【讨论】:

  • 在可以正则表达式或非正则表达式的字符串中测试 =、=~、!=、!~ 的最佳方法应该是什么?
  • @zubug55 我已编辑答案以包含替代方法的示例。
  • 我需要完全匹配 =, =~, !=, !~ 。您的方法的问题是“exported_pod=~.*grafana.*”也将匹配 =。它应该只匹配 =~
  • @zubug55 不匹配 =: play.golang.org/p/3eziI5feXuV
猜你喜欢
  • 2019-06-01
  • 1970-01-01
  • 2016-01-22
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2015-04-27
  • 1970-01-01
相关资源
最近更新 更多