我正在嘗試編寫一個程序,從終端輸入打印 IPv4 地址的無效部分。這是我的代碼:package chapter4import ( "bufio" "fmt" "os" "regexp" "strings" "time")func IPV4() { var f *os.File f = os.Stdin defer f.Close() scanner := bufio.NewScanner(f) fmt.Println("Exercise 1, Chapter 4 - Detecting incorrect parts of IPv4 Addresses, enter an address!") for scanner.Scan() { if scanner.Text() == "STOP" { fmt.Println("Initializing Level 4...") time.Sleep(5 * time.Second) break } expression := "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])" matchMe, err := regexp.Compile(expression) if err != nil { fmt.Println("Could not compile!", err) } s := strings.Split(scanner.Text(), ".") for _, value := range s { fmt.Println(value) str := matchMe.FindString(value) if len(str) == 0 { fmt.Println(value) } } }}我的思考過程是,對于每個終端IP地址輸入,我用“.”分割字符串。然后我迭代結果[]string并將每個值與正則表達式匹配。由于某種原因,正則表達式不匹配的唯一情況是輸入中存在字母字符。每個數字,無論大小或組成,都與我的表達有效匹配。我希望你能幫助我找出問題所在,如果有更好的方法,我洗耳恭聽。謝謝!
2 回答

慕桂英4014372
TA貢獻1871條經驗 獲得超13個贊
也許,這個表達可能更接近你的想法:
^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$
測試
package main
import (
? ? "regexp"
? ? "fmt"
)
func main() {
? ? var re = regexp.MustCompile(`(?m)^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$`)
? ? var str = `127.0.0.1
192.168.1.1
192.168.1.255
255.255.255.255
0.0.0.0
1.1.1.01
30.168.1.255.1
127.1
192.168.1.256
-1.2.3.4
3...3`
? ? for i, match := range re.FindAllString(str, -1) {
? ? ? ? fmt.Println(match, "found at index", i)
? ? }
}
參考:
使用正則表達式驗證 IPv4 地址
正則表達式電路
jex.im可視化正則表達式:
- 2 回答
- 0 關注
- 144 瀏覽
添加回答
舉報
0/150
提交
取消