我正在尝试编写一个程序,从终端输入打印 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 关注
- 109 浏览
添加回答
举报
0/150
提交
取消