1.19.2 正则全部匹配 域名,无法匹配

1. 运行环境

go version go1.19.2 windows/amd64
//: <> (当前使用的Go版本,及系统版本、系统架构?)
//: <> (使用go version 命令查看,期望的结果如:go 1.12, linux/amd64)

2. 问题描述?

正则不懂为何无法使用,原来在 go 1.17.2 还可以的

通过 正则表达式匹配 域名内容

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "regexp"
    "strings"
)

var (
    f_file         []string
    domain_one_two = [][]string{{"com.cn", "mil.cn", "edu.cn", "net.cn", "gov.cn", "org.cn", "int.cn"}, {"cn", "com", "edu", "gov", "int", "mil", "net", "org", "biz", "info", "pro", "name", "museum", "coop", "aero", "xxx", "idv"}} // 根域名以及国内的二级域名

)

func in(target string, s []string) bool { // 判断是否重复
    for _, element := range s {

        if target == element {
            return true
        }
    }
    return false
}

func main() {

    fi, err := os.Open("./url.txt")
    if err != nil {
        panic(err)
    }
    r := bufio.NewReader(fi) // 创建 Reader

    var file []string
    for {

        lineBytes, err := r.ReadBytes('\n')
        //去掉字符串首尾空白字符,返回字符串
        line := strings.TrimSpace(string(lineBytes))
        // fmt.Printf("%T %v\n", line, line)
        file = append(file, line)
        if err == io.EOF {
            f_file = file
            // fmt.Println(111)
            // fmt.Printf("%T %v", f_file, f_file)
            // fmt.Println(111)
            break
        }
        // fmt.Println("----------------------------------------")

    }

    var str_reg string = strings.Join(f_file, "\n")
    fmt.Println(str_reg)
    re := regexp.MustCompile(`[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?`)
    // re := regexp.Compile(`[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?`)
    domain_text := re.FindAllStringSubmatch(str_reg, -1) // 莫名奇妙 不能筛选
    var domain_return []string
    fmt.Printf("%T %v", domain_text, domain_text) //[][]string 类型 筛选结果
    // fmt.Printf("%T %v", domain_one_two[0], domain_one_two[0])                   //[][]string 类型
    var x []string = strings.Split(strings.Join(domain_one_two[1], "\n"), "\n") // 将[][] string 转成 []string

    for _, i := range domain_text {
        // fmt.Println(i[0])
        fmt.Println(strings.Split(i[0], ".")[len(strings.Split(i[0], "."))-1])
        if in(strings.Split(i[0], ".")[len(strings.Split(i[0], "."))-1], x) { //判断是否是域名,归属于根域名
            fmt.Println(i[0])
            domain_return = append(domain_return, i[0])
        }

    }
}

url.txt 内容

www.baidu.com
123.123.com
aabb.com.com

3. 您期望得到的结果?

��www.baidu.com
123.123.com
aabb.com.com
[][]string []
[www.baidu.com 123.123.com aabb.com.com ]

4. 您实际得到的结果?

��www.baidu.com
123.123.com
aabb.com.com
[][]string []
[]

讨论数量: 7

试试这个: github.com/mvdan/xurls

1年前 评论
mmsk (楼主) 1年前
chuoke (作者) 1年前
mmsk (楼主) 1年前
don178 1年前
package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"

    "mvdan.cc/xurls/v2"
)

var (
    f_file         []string
    domain_one_two = [][]string{{"com.cn", "mil.cn", "edu.cn", "net.cn", "gov.cn", "org.cn", "int.cn"}, {"cn", "com", "edu", "gov", "int", "mil", "net", "org", "biz", "info", "pro", "name", "museum", "coop", "aero", "xxx", "idv"}} // 根域名以及国内的二级域名

)

func in(target string, s []string) bool { // 判断是否重复
    for _, element := range s {

        if target == element {
            return true
        }
    }
    return false
}

func main() {

    fi, err := os.OpenFile("./url.txt", os.O_RDWR|os.O_CREATE, 0775)
    if err != nil {
        panic(err)
    }
    r := bufio.NewReader(fi) // 创建 Reader

    var file []string
    for {

        lineBytes, err := r.ReadBytes('\n')
        //去掉字符串首尾空白字符,返回字符串
        line := strings.TrimSpace(string(lineBytes))
        // fmt.Printf("%T %v\n", line, line)
        file = append(file, line)
        if err == io.EOF {
            f_file = file
            // fmt.Println(111)
            // fmt.Printf("%T %v", f_file, f_file)
            // fmt.Println(111)
            break
        }
        // fmt.Println("----------------------------------------")

    }

    var str_reg string = strings.Join(f_file, "\n")
    fmt.Println(str_reg)
    // re := regexp.MustCompile(`[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?`)
    // re := regexp.Compile(`[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?`)
    rxRelaxed := xurls.Strict()
    domain_text := rxRelaxed.FindAllStringSubmatch(str_reg, -1)

    fmt.Print(domain_text)

    // domain_text := re.FindAllStringSubmatch(str_reg, -1) // 莫名奇妙 不能筛选
    var domain_return []string
    fmt.Printf("%T %v\n", domain_text, domain_text) //[][]string 类型 筛选结果
    // fmt.Printf("%T %v", domain_one_two[0], domain_one_two[0])                   //[][]string 类型
    var x []string = strings.Split(strings.Join(domain_one_two[1], "\n"), "\n") // 将[][] string 转成 []string

    for _, i := range domain_text {
        // fmt.Println(i[0])
        fmt.Println(strings.Split(i[0], ".")[len(strings.Split(i[0], "."))-1])
        if in(strings.Split(i[0], ".")[len(strings.Split(i[0], "."))-1], x) { //判断是否是域名,归属于根域名
            fmt.Println(i[0])
            domain_return = append(domain_return, i[0])
        }

    }

    fmt.Println(domain_return)
}

url.txt 的内容

http://www.zyxwe.com/
http://www.zhuyexiaowei.com/
http://www.xinxiloan.com/
http://www.xiaohuaqianbao.com/
http://www.xiaohuaqb.com/
http://cusbot.xiaohuaqb.com/
http://sptest.xiaohuaqb.com/
http://sp.xiaohuaqb.com/
http://moa.xiaohuaoa.com/
http://www.xiaohuaoa.com/
http://el-gw.xiaohuaai.com/
http://wxflowapp2.xiaohuaai.com/
http://zzyv5-t.xiaohuaai.com/
http://zzy-t.xiaohuaai.com/
http://www.xiaohuaai.com/
http://zzyv5.xiaohuaai.com/
http://ioa-ctl2.xiaohuaai.com/
http://ioa-gw2.xiaohuaai.com/
http://oa.xiaohuaai.com/
http://pcqjump.xiaohuaai.com/
http://auth.xiaohuaai.com/
http://ioa.xiaohuaai.com/

结果
Go

1年前 评论

不是,这需要用到正则吗,直接把每行拿出来加到 slice 中 不行吗。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!