如何在 Go 中将包含非数字字符的字符串拆分为字符串数组



如何将包含非数字字符的字符串拆分和过滤为仅包含数字字符的字符串数组?

例如,

str := "035a 444$ bb" 
//split str into s
s := []string{"0", "3", "5", "4", "4", "4"} 

您在这里尝试做两件独立的事情,因此您需要首先在脑海中将它们分开:

首先,您正在尝试删除所有非数字字符。

其次,您尝试将所有剩余字符拆分为包含单个字符的切片。

没有内置函数可以从字符串中删除非数字字符,但您可以编写正则表达式匹配和替换来执行此操作:

str := "035a 444$ bb"
reg, err := regexp.Compile("[^0-9]+")
if err != nil {
panic(err)
}
numericStr := reg.ReplaceAllString(str, "")

正则表达式匹配不在 0-9(含 0-9)中的任何字符。然后regexp.ReaplceAllString()用任何内容替换这些字符。

这会导致numericStr包含字符串

"035444"

之后,您可以使用strings.Split()来获取所需的切片。

s := strings.Split(numericStr, "")

文档告诉我们:

如果 sep 为空,则在每个 UTF-8 序列之后拆分拆分。

所以s变成了:

[]string{"0", "3", "5", "4", "4", "4"}

这应该有效。

func getNumericChars(s string) []string {
var result []string
// iterating through each character in string
for _, c := range strings.Split(s, "") {
// if character can be converted to number append it to result 
if _, e := strconv.Atoi(c); e == nil {
result = append(result, c)
}
}
return result
}

呼叫s := getNumericChars("035a 444$ bb")
s 将被[0 3 5 4 4 4]

XY 问题

XY问题是询问您尝试的解决方案,而不是您的实际问题。


为什么你想要一个个位数字符串的切片而不是一个数字字符串?

例如

package main
import "fmt"
func number(s string) string {
n := make([]byte, 0, len(s))
for _, r := range s {
if r >= '0' && r <= '9' {
n = append(n, byte(r))
}
}
return string(n)
}
func main() {
str := "035a 444$ bb"
fmt.Println(str)
num := number(str)
fmt.Println(num)
}

输出:

035a 444$ bb
035444

最新更新