为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
暮色呼如 2021-10-25 17:11:05
看起来以下作品,这是一个好方法吗?var thestr = "192.168.0.1"if (thestr[0]>= '0' && thestr[0] <= '9'){    //...}
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

由于您是按字符比较并且没有字符介于 1 和 9 之间,因此我认为您的解决方案是可以的,但它没有考虑后面的其他数字。

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

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

就像是

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


查看完整回答
反对 回复 2021-10-25
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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


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


这里有一些其他的选择,在Go Playground上尝试所有:


1) 测试字节范围:

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


s := "12asdf"

fmt.Println(s[0] >= '0' && s[0] <= '9')

2)使用fmt.Sscanf():

注意:如果string以负数开头,这也接受,决定它是否对你来说是一个问题(例如 accepts "-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))


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信