它看起来如下作品,这是一个好方法吗?
var thestr = "192.168.0.1"
if (thestr[0]>= '0' && thestr[0] <= '9'){
//...
}
答案 0 :(得分:2)
你的解决方案完全没问题。
但请注意,Go中的字符串存储为只读字节片,其中字节是UTF-8编码的字节序列,索引字符串索引其字节,而不是其符文(字符) )。但由于十进制数字('0'..'9'
)只有一个字节,因此在这种情况下可以测试第一个byte
,但首先应测试len(s) > 0
或s != ""
以下是其他一些选择,请尝试Go Playground:
这是你的解决方案,可能是最快的解决方案:
s := "12asdf"
fmt.Println(s[0] >= '0' && s[0] <= '9')
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
unicode.IsDigit()
:fmt.Println(unicode.IsDigit(rune(s[0])))
regexp
:我可能永远不会使用它,因为这是迄今为止最慢的,但现在是:
r := regexp.MustCompile(`^\d`)
fmt.Println(r.FindString(s) != "")
或者:
r := regexp.MustCompile(`^\d.*`)
fmt.Println(r.MatchString(s))
答案 1 :(得分:0)
请不要使用正则表达式完成这个简单的任务:)
在这种情况下我会改变:
.5e-45
是一个数字,但可能不是你想要的。 0的语义也不简单:https://math.stackexchange.com/questions/238737/why-do-some-people-state-that-zero-is-not-a-number 答案 2 :(得分:-1)
由于你是按字符进行比较而且没有字符在1到9之间,我认为你的解决方案没问题,但它没有考虑其他数字。
例如,如果thestr
为"192.something.invalid"
,则它不再是IP。
我建议使用正则表达式检查IP。
类似
\b(?:\d{1,3}\.){3}\d{1,3}\b