3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個贊
由于您是按字符比較并且沒有字符介于 1 和 9 之間,因此我認(rèn)為您的解決方案是可以的,但它沒有考慮后面的其他數(shù)字。
例如,如果thestr
是"192.something.invalid"
它不再是一個IP。
我建議使用正則表達(dá)式來檢查 IP。
就像是
\b(?:\d{1,3}\.){3}\d{1,3}\b

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個贊
您的解決方案完全沒問題。
但請注意,Go 中的字符串存儲為只讀字節(jié)切片,其中字節(jié)是 UTF-8 編碼的字節(jié)序列,并且索引字符串索引其bytes,而不是它的符文(字符)。但是由于十進(jìn)制數(shù)字 ( '0'..'9') 恰好有一個字節(jié),因此在這種情況下可以測試第一個byte,但首先您應(yīng)該測試 iflen(s) > 0或s != ""。
這里有一些其他的選擇,在Go Playground上嘗試所有:
1) 測試字節(jié)范圍:
這是您的解決方案,可能是最快的解決方案:
s := "12asdf"
fmt.Println(s[0] >= '0' && s[0] <= '9')
2)使用fmt.Sscanf():
注意:如果string以負(fù)數(shù)開頭,這也接受,決定它是否對你來說是一個問題(例如 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:
我可能永遠(yuǎn)不會使用它,因?yàn)檫@是迄今為止最慢的,但它是:
r := regexp.MustCompile(`^\d`)
fmt.Println(r.FindString(s) != "")
或者:
r := regexp.MustCompile(`^\d.*`)
fmt.Println(r.MatchString(s))
- 3 回答
- 0 關(guān)注
- 205 瀏覽
添加回答
舉報