登录
首页 >  Golang >  Go问答

如何在 Go 中模拟负向回溯

来源:Golang技术栈

时间:2023-04-29 15:03:23 492浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《如何在 Go 中模拟负向回溯》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下golang,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我正在尝试编写一个可以提取命令的正则表达式,这是我到目前为止使用否定后向断言所得到的:

\b(?

所以输入:

/msg @nickname #channel foo bar baz
/foo #channel @nickname foo bar baz 
foo bar baz

foo bar baz每次都被提取。请参阅工作示例 https://regex101.com/r/lF9aG7/3

但是在 Go 中,这不会编译http://play.golang.org/p/gkkVZgScS_

它抛出:

panic: regexp: Compile(`\b(?

我做了一些研究,发现语言不支持负面的后视来保证 O(n) 时间。

我怎样才能重写这个正则表达式,以便它在没有负面后视的情况下做同样的事情?

正确答案

因为在你否定的lookbehind中,你只使用了一个简单的字符集;您可以将其替换为否定字符集:

\b[^@#/]\w.*

如果在字符串的开头允许使用,则使用^锚点:

(?:^|[^@#\/])\b\w.*

根据您问题中 Go Playground 链接中的示例,我认为您希望过滤掉所有以[#@/]. 你可以使用一个filter函数:

func Filter(vs []string, f func(string) bool) []string {
    vsf := make([]string, 0)
    for _, v := range vs {
        if f(v) {
            vsf = append(vsf, v)
        }
    }
    return vsf
}

和一个Process函数,它使用上面的过滤器:

func Process(inp string) string {
    t := strings.Split(inp, " ")
    t = Filter(t, func(x string) bool {
        return strings.Index(x, "#") != 0 &&
            strings.Index(x, "@") != 0 &&
            strings.Index(x, "/") != 0
    })
    return strings.Join(t, " ")
}

可以在http://play.golang.org/p/ntJRNxJTxo上的操场上看到它

以上就是《如何在 Go 中模拟负向回溯》的详细内容,更多关于golang的资料请关注golang学习网公众号!

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