我正在尝试编写一个slackbot。我已经尝试了来自github的各种框架,但是我使用过的最有前途的似乎是hanu
我想做的就是像这样向机器人发送消息:
@bot <command> "Something" "Another thing that contains spaces" "A final thing with spaces"
然后我希望将这三个参数中的每一个作为字符串传递给var,然后var具有可以执行的句柄函数。
我似乎无法做到这一点!上面链接的hanu框架似乎使用this框架,其中指出:
分配库支持占位符和正则表达式 参数匹配和解析。
但是因为我是一个糟糕的开发人员,所以我似乎无法在上面的框架中弄清楚该怎么做,因为没有示例。
所以我希望能够:
答案 0 :(得分:1)
一种方法是滥用strings.FieldsFunc(...)
,以仅在引号中未包含空格的情况下拆分字符串:
func main() {
s := `@bot <command> "Something" "Another thing that contains spaces, it's great" "A final thing with spaces"`
tokens := splitWithQuotes(s)
for i, t := range tokens {
fmt.Printf("OK: tokens[%d] = %s\n", i, t)
}
// OK: tokens[0] = @bot
// OK: tokens[1] = <command>
// OK: tokens[2] = "Something"
// OK: tokens[3] = "Another thing that contains spaces, it's great"
// OK: tokens[4] = "A final thing with spaces"
}
func splitWithQuotes(s string) []string {
inquote := false
return strings.FieldsFunc(s, func(c rune) bool {
switch {
case c == '"':
inquote = !inquote
return false
case inquote:
return false
default:
return unicode.IsSpace(c)
}
})
}
严格来说,此方法可能不适用于所有版本的golang,因为根据文档:
如果f对于给定的c没有返回一致的结果,则FieldsFunc可能会崩溃。
...并且此函数肯定会返回不同的空格字符结果;但是,它似乎可以在1.9和更高版本上使用,所以我想这取决于您对冒险的兴趣!