【发布时间】:2011-05-26 20:24:32
【问题描述】:
我真的是 Go 新手,到目前为止一直很享受它。我正在尝试找到一种使用正则表达式而不是字符串来拆分字符串的好方法。谢谢
【问题讨论】:
标签: regex go string-split
我真的是 Go 新手,到目前为止一直很享受它。我正在尝试找到一种使用正则表达式而不是字符串来拆分字符串的好方法。谢谢
【问题讨论】:
标签: regex go string-split
您可以使用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!"]
}
【讨论】:
我根据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]
【讨论】:
如果你只是想分割某些字符,你可以使用strings.FieldsFunc,否则我会使用regexp.FindAllString。
【讨论】:
regexp.Split() 函数将是执行此操作的最佳方法。
【讨论】:
您应该能够创建自己的拆分函数,循环遍历 RegExp.FindAllString 的结果,将中间的子字符串放入一个新数组中。
http://nsf.github.com/go/regexp.html?m:Regexp.FindAllString!
【讨论】:
RegExp,但正确的包名是regexp。 Go 区分大小写!
我在寻找答案时发现了这篇旧帖子。我是 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]+"))
}
【讨论】: