【问题标题】:Split a string at the last occurrence of the separator in golang在golang中最后一次出现分隔符处拆分字符串
【发布时间】:2019-01-06 22:58:03
【问题描述】:

我正在尝试通过 golang 中最后出现的分隔符 (/) 来拆分字符串

例如,我有一个字符串“a/b/c/d”,执行拆分后,我想要一个字符串数组,如下所示

[
"a/b/c",
"a/b"
"a"
]

我尝试探索字符串包,但找不到执行此操作的任何函数

func main() {
    fmt.Printf("%q\n", strings.Split("a/b/c/d/e", "/"))
}

我可以知道如何处理这个问题吗?

【问题讨论】:

标签: string go split


【解决方案1】:

使用strings.LastIndex仅在最后一次出现时拆分任何字符串

import (
    "fmt"
    "strings"
)

func main() {
    x := "a_ab_daqe_sd_ew"
    lastInd := strings.LastIndex(x, "_")
    fmt.Println(x[:lastInd]) // o/p: a_ab_daqe_sd
    fmt.Println(x[lastInd+1:]) // o/p: ew
}

注意,strings.LastIndex 如果子字符串通过则返回 -1(在上面的示例中,“_”)未找到

【讨论】:

    【解决方案2】:

    由于这是用于路径操作,并且看起来您不想要尾随路径分隔符,因此 path.Dir 会满足您的需求:

    fmt.Println(path.Dir("a/b/c/d/e"))
    // a/b/c/d
    

    如果这专门用于文件系统路径,您将需要使用 filepath 包来正确处理多个路径分隔符。

    【讨论】:

      【解决方案3】:

      这是一个简单的函数,它使用filepath.Dir(string) 构建给定文件路径的所有祖先目录的列表:

      func main() {
        fmt.Printf("OK: %#v\n", parentsOf("a/b/c/d"))
        // OK: []string{"a/b/c", "a/b", "a"}
      }
      
      func parentsOf(s string) []string {
        dirs := []string{}
        for {
          parent := filepath.Dir(s)
          if parent == "." || parent == "/" {
            break
          }
          dirs = append(dirs, parent)
          s = parent
        }
        return dirs
      }
      

      【讨论】:

        猜你喜欢
        • 2014-10-08
        • 2011-01-28
        • 2014-01-21
        • 1970-01-01
        • 2011-11-13
        • 2017-04-29
        • 2011-07-31
        • 2020-08-11
        • 2017-04-23
        相关资源
        最近更新 更多