猿问

IPv4 正则表达式捕获地址的不正确部分

我正在尝试编写一个程序,从终端输入打印 IPv4 地址的无效部分。


这是我的代码:


package chapter4


import (

    "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并将每个值与正则表达式匹配。


由于某种原因,正则表达式不匹配的唯一情况是输入中存在字母字符。每个数字,无论大小或组成,都与我的表达有效匹配。


我希望你能帮助我找出问题所在,如果有更好的方法,我洗耳恭听。谢谢!


GCT1015
浏览 110回答 2
2回答

慕桂英4014372

也许,这个表达可能更接近你的想法:^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$测试package mainimport (    "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.1192.168.1.1192.168.1.255255.255.255.2550.0.0.01.1.1.0130.168.1.255.1127.1192.168.1.256-1.2.3.43...3`    for i, match := range re.FindAllString(str, -1) {        fmt.Println(match, "found at index", i)    }}参考:使用正则表达式验证 IPv4 地址正则表达式电路jex.im可视化正则表达式:

守着一只汪

我非常确定您的表达式需要锚点,否则它的最后一部分将匹配任何单个数字并成功。尝试^在正面和$背面使用。
随时随地看视频慕课网APP

相关分类

Go
我要回答