【问题标题】:Go how can i efficient split string into parts去我怎样才能有效地将字符串分成几部分
【发布时间】:2017-09-21 19:16:08
【问题描述】:

我正在与字符串拆分作斗争。我想通过 wildcards 将字符串分割成一个 slice,但是这个 slice 也应该包含这个通配符。

例如:/applications/{name}/tokens/{name} 应拆分为 [/applications/ {name} /tokens/ {name}] 等。

这是我写的一个示例代码,但它不能正常工作,我也觉得不好。

https://play.golang.org/p/VMOsJeaI4l

有一些示例路线需要测试。方法splitPath 将路径拆分为部分并显示:之前和之后。

【问题讨论】:

  • 您是否有不想使用strings.Split 的原因? golang.org/pkg/strings/#Split
  • ye 因为我希望包含separator,在我的情况下分隔符可以不同,例如{name}/{surname}。你不知道{} 之间是什么字符串以及它们有多少个
  • 我仍然认为使用strings.Split 会得到最好的结果,但你可能对编写解析器感兴趣;它们很有趣,Rob Pike 有一个比较著名的演讲,解释如何编写自定义词法扫描器,这也很有趣。
  • 我不确定我是否理解您的要求,但这就是您想要的吗? play.golang.org/p/qcqBgld2_I
  • 是的,快速浏览一下就完美了,我认为它可以按我的意愿工作。谢谢,我现在将像@JohnWeldon 提到的那样做解析器/词法分析器解决方案,然后比较这两者的性能

标签: string go split


【解决方案1】:

这里有一个解决方案:

var validPathRe = regexp.MustCompile("^(/{[[:alpha:]]+}|/[-_.[:alnum:]]+)+$")
var splitPathRe = regexp.MustCompile("({[[:alpha:]]+}|[-_.[:alnum:]]+)")

func splitPath(path string) parts{
    var retPaths parts

    if !validPathRe.MatchString(path) {
        return retPaths
    }

    retPaths = splitPathRe.FindAllString(path, -1)

    return retPaths
}

我通过创建两个正则表达式来做到这一点,一个用于检查路径是否有效,另一个用于提取路径的各个部分并返回它们。如果路径无效,它将返回一个空列表。 this 的返回将如下所示:

splitPath("/path/{to}/your/file.txt")
["path" "{to}" "your" "file.txt"]

这不包括“/”字符,因为您已经知道返回中的所有字符串,但最后一个字符串是目录,最后一个字符串是文件名。由于有效性检查,您可以假设这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多