【问题标题】:Split string using regular expression in Go在 Go 中使用正则表达式拆分字符串
【发布时间】:2011-05-26 20:24:32
【问题描述】:

我真的是 Go 新手,到目前为止一直很享受它。我正在尝试找到一种使用正则表达式而不是字符串来拆分字符串的好方法。谢谢

http://nsf.github.com/go/strings.html?f:Split!

【问题讨论】:

    标签: regex go string-split


    【解决方案1】:

    您可以使用regexp.Split 将字符串拆分为以正则表达式模式作为分隔符的字符串切片。

    package main
    
    import (
        "fmt"
        "regexp"
    )
    
    func main() {
        re := regexp.MustCompile("[0-9]+")
        txt := "Have9834a908123great10891819081day!"
    
        split := re.Split(txt, -1)
        set := []string{}
    
        for i := range split {
            set = append(set, split[i])
        }
    
        fmt.Println(set) // ["Have", "a", "great", "day!"]
    }
    

    【讨论】:

    • 这对我帮助很大。
    【解决方案2】:

    我根据java、c#、php中regex split函数的行为做了一个regex-split函数。它只返回一个字符串数组,没有索引信息。

    func RegSplit(text string, delimeter string) []string {
        reg := regexp.MustCompile(delimeter)
        indexes := reg.FindAllStringIndex(text, -1)
        laststart := 0
        result := make([]string, len(indexes) + 1)
        for i, element := range indexes {
                result[i] = text[laststart:element[0]]
                laststart = element[1]
        }
        result[len(indexes)] = text[laststart:len(text)]
        return result
    }
    

    示例:

    fmt.Println(RegSplit("a1b22c333d", "[0-9]+"))
    

    结果:

    [a b c d]
    

    【讨论】:

      【解决方案3】:

      如果你只是想分割某些字符,你可以使用strings.FieldsFunc,否则我会使用regexp.FindAllString

      【讨论】:

      • 我试过这个,但它覆盖了我想要分割的字符。我不想丢失字符,只需插入一个空格。我使用了一个 for 循环来达到我的目标。谢谢。 PS - 你的答案不包括正则表达式,也许这就是为什么会有反对票?
      • 没有什么被“覆盖”,这只是返回什么的问题。如果您愿意,您可以随时使用不同的正则表达式函数来获取索引并使用它们。
      【解决方案4】:

      regexp.Split() 函数将是执行此操作的最佳方法。

      【讨论】:

      【解决方案5】:

      您应该能够创建自己的拆分函数,循环遍历 RegExp.FindAllString 的结果,将中间的子字符串放入一个新数组中。

      http://nsf.github.com/go/regexp.html?m:Regexp.FindAllString!

      【讨论】:

      • 不确定你从哪里得到RegExp,但正确的包名是regexp。 Go 区分大小写!
      【解决方案6】:

      我在寻找答案时发现了这篇旧帖子。我是 Go 新手,但对于当前版本的 Go,这些答案似乎过于复杂。下面的简单函数返回与上面相同的结果。

      package main
      
      import (
          "fmt"
          "regexp"
      )
      
      func goReSplit(text string, pattern string) []string {
          regex := regexp.MustCompile(pattern)
          result := regex.Split(text, -1)
          return result
      }
      
      func main() {
          fmt.Printf("%#v\n", goReSplit("Have9834a908123great10891819081day!", "[0-9]+"))
      }
      

      【讨论】:

        猜你喜欢
        • 2019-09-17
        • 2017-02-23
        相关资源
        最近更新 更多