29

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

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

4

6 回答 6

30

您可以使用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!"]
}
于 2018-07-05T16:12:49.317 回答
18

我根据 java、c#、php 中的正则表达式拆分函数的行为制作了一个正则表达式拆分函数。它只返回一个字符串数组,没有索引信息。

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]
于 2013-02-08T03:10:29.940 回答
14

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

于 2011-02-25T17:51:35.433 回答
12

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

于 2017-02-05T19:10:11.293 回答
2

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

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

于 2010-12-16T23:08:05.720 回答
1

我在寻找答案时发现了这个旧帖子。我是 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]+"))
}
于 2020-10-23T06:26:50.897 回答