检查字符串是否以十进制数字开头?

时间:2015-07-28 14:09:53

标签: string parsing go

它看起来如下作品,这是一个好方法吗?

var thestr = "192.168.0.1"
if (thestr[0]>= '0' && thestr[0] <= '9'){
    //...
}

3 个答案:

答案 0 :(得分:2)

你的解决方案完全没问题。

但请注意,Go中的字符串存储为只读字节片,其中字节是UTF-8编码的字节序列,索引字符串索引其字节,而不是其符文(字符) )。但由于十进制数字('0'..'9')只有一个字节,因此在这种情况下可以测试第一个byte,但首先应测试len(s) > 0s != ""

以下是其他一些选择,请尝试Go Playground

1)测试字节范围:

这是你的解决方案,可能是最快的解决方案:

s := "12asdf"
fmt.Println(s[0] >= '0' && s[0] <= '9')

2)使用fmt.Sscanf()

注意:如果string以否定号开头,也会接受此选项,请确定是否存在问题(例如,接受"-12asf")。

i := 0
n, err := fmt.Sscanf(s, "%d", &i)
fmt.Println(n > 0, err == nil) // Both n and err can be used to test

3)使用unicode.IsDigit()

fmt.Println(unicode.IsDigit(rune(s[0])))

4)使用regexp

我可能永远不会使用它,因为这是迄今为止最慢的,但现在是:

r := regexp.MustCompile(`^\d`)
fmt.Println(r.FindString(s) != "")

或者:

r := regexp.MustCompile(`^\d.*`)
fmt.Println(r.MatchString(s))

答案 1 :(得分:0)

请不要使用正则表达式完成这个简单的任务:)

在这种情况下我会改变:

答案 2 :(得分:-1)

由于你是按字符进行比较而且没有字符在1到9之间,我认为你的解决方案没问题,但它没有考虑其他数字。

例如,如果thestr"192.something.invalid",则它不再是IP。

我建议使用正则表达式检查IP。

类似

\b(?:\d{1,3}\.){3}\d{1,3}\b