以 .* 开头的 =~ 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
是一个数组,其中包含任何 =~
之前和之后的部分(正则表达式检测到的分隔符)。
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
是一个数组,其中包含任何 =~
之前和之后的部分(正则表达式检测到的分隔符)。