登录
首页 >  Golang >  Go问答

匹配直到字符,但不包含该字符

来源:stackoverflow

时间:2024-04-05 21:51:38 115浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《匹配直到字符,但不包含该字符》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我正在尝试匹配以下输入:

foo=bar baz foo:1  foo:234.mds32  notfoo:baz  foo:bak foo:nospace foo:bar

和输出 6 匹配:除了 notfoo 之外的所有内容。匹配应该类似于 foo:bar (即不包括尾随或前导空格。

一般来说,我尝试匹配的规则是:

  • 查找任意 kv 对,其中键为 foo,并且 kv 对由 =: 分隔。
  • 对是彼此分开的字符串。 kv 对之间可能有多个空格或随机字符串。
  • 由于 ^,kv 对的两侧必须有空格或行开头/结尾。

目前最好的正则表达式是 '(?:\s|^)(?pfoo[:=].+?)\s',然后提取 primary 组。

这个问题是因为我们将 \s 作为匹配的一部分,我们遇到了重叠正则表达式的问题:foo:bak foo:nospace foo:bar 被破坏,因为我们尝试使用空白字符匹配了 2x,并且 golang 正则表达式不会返回重叠匹配。

在其他正则表达式引擎中,我认为可以使用前瞻,但据我所知,golang 正则表达式不允许这样做。

有什么办法可以实现这一点吗?

go演示链接:https://play.golang.org/p/n8gnwwpibsr


正确答案


遗憾的是,go regexp 中没有环视支持,因此,您可以通过加倍空格来解决此限制(例如使用 regexp.mustcompile(\s).replaceallstring(d, "$0$0"))然后与 (?:\s|^)(?pfoo[:=]\s+(?:\s+[^:\s]+)*)(?:\s|$):

匹配>
package main

import (
    "fmt"
    "regexp"
)

func main() {
    var d = `foo=bar baz foo:1  foo:234.mds32  notfoo:baz  foo:bak foo:nospace foo:bar`
    d = regexp.mustcompile(`\s`).replaceallstring(d, "$0$0")
    r := regexp.mustcompile(`(?:\s|^)(?pfoo[:=]\s+(?:\s+[^:\s]+)*)(?:\s|$)`)
    idx := r.subexpindex("primary")
    for _, m := range r.findallstringsubmatch(d, -1) {
        fmt.printf("%q\n", m[idx])
    }
}

参见 Go demo。输出:

"foo=bar  baz"
"foo:1"
"foo:234.mds32"
"foo:bak"
"foo:nospace"
"foo:bar"

详细信息

  • (?:\s|^) - 空格或字符串开头
  • (?pfoo[:=]\s+(?:\s+[^:\s]+)*) - “主要”组:foo、冒号或 = 字符、一个或多个非空格,然后零次或多次出现一个或多个空格,然后是除空格或冒号之外的一个或多个字符
  • (?:\s|$) - 空白或字符串结尾。

好了,本文到此结束,带大家了解了《匹配直到字符,但不包含该字符》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>