正则表达式匹配子域

时间:2017-11-29 05:29:38

标签: regex go

我需要一个匹配特定域的所有子域的正则表达式。内容媒体类型未知(例如,可能是urlencoded,json等) 到目前为止,我已经得到了这个简单的正则表达式 re, err := regexp.Compile(`([-a-z0-9])+[.](.*)domain.com`)

问题是,对于一个字符串,这样整个字符串下面的Found代替获取特定的sudomains,如prefix1-prefix2.domain.com,所以问题是我需要什么正则表达才能获得没有的子域名额外的字符串(即%2Fdocument...

prefix1-prefix2.domain.com%2Fdocument%2F%3Fusp%3Dmkt_docs%26lng%3Den&followup=https%3A%2F%2Fprefix1-prefix2.domain.com%2Fdocument%2F%3Fusp%3Dmkt_docs%26lng%

2 个答案:

答案 0 :(得分:2)

我建议使用可以为您解析URL的url包,然后检查域。否则你可能会遇到一些陷阱,如符号逃逸等。

https://play.golang.org/p/6so9FTfOSo

更新:更新了配方,源URL中也出现错误 - 最后%后面没有十六进制代码。

package main

import (
    "fmt"
    "net/url"
    "strings"
)

var s = "prefix1-prefix2.domain.com%2Fdocument%2F%3Fusp%3Dmkt_docs%26lng%3Den&followup=https%3A%2F%2Fprefix1-prefix2.domain.com%2Fdocument%2F%3Fusp%3Dmkt_docs%26lng"

func main() {
    s2, err := url.QueryUnescape(s)
    u, err := url.Parse(s2)
    if err != nil {
        fmt.Println("error")
    }
    if u.Scheme == "" {
        s2 = "https://" + s2
    }
    fmt.Println(s2, err)
    u, err = url.Parse(s2)

    fmt.Printf("%#v %v", u, err)

    fmt.Println(u.Host)
    if strings.HasSuffix(u.Host, ".domain.com") {
        fmt.Println("subdomain!")
    }
}

答案 1 :(得分:0)

你的正则表达式中的贪婪(.*)匹配你不想要的所有东西,你可以删除它。此外,我转义了您的.个字符,并将您的+移至捕获组内。

将您的正则表达式更改为:([-a-z0-9]+)\.domain\.com或在代码的上下文中:

regexp.Compile(`([-a-z0-9]+)\.domain\.com`)

您可以使用regex101 fiddle进行测试。