2017-11-29 17 views
1

特定のドメインのすべてのサブドメインに一致する正規表現が必要です。コンテンツのメディアタイプが不明です(IGがJSONなど、URLエンコードすることができる) これまでのところ私は、問題は、この文字列全体、以下のように文字列を取得する代わりにFoundであるということである。この単純な正規表現 re, err := regexp.Compile(`([-a-z0-9])+[.](.*)domain.com`)regex match subdomain

を持っています特定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%

答えて

0

あなたの正規表現で貪欲(.*)はすべてのものに一致しているあなたドンあなたが欲しい、あなたがいないそれを取り除く。また、あなたの.文字をエスケープして、+をキャプチャグループ内に移動しました。

にあなたの正規表現を変更し

([-a-z0-9]+)\.domain\.comまたはあなたのコードのコンテキストで:

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

は、ここであなたがそれをテストすることができregex101 fiddleです。

2

あなたのためにURLを解析してからドメインをチェックすることができるurlパッケージをお勧めします。そうしないとあなたがUPD

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!") 
    } 
} 
+0

これは、URLを解析することがすぐに複雑になり、URLライブラリが適切なURL部分を引き出すことができるようになります。 – Matt

+0

かなり同意する - それは私がお勧めする方法です;)それはもう1つの利点を持っていますurl libエラーと無効なシーケンスのURLをチェックします。私は上記のレシピを載せました。 –

+0

私はJavaScript(ソースコード)からURLを抽出するためにそれを使用しましたが、私は多くのゴミで終わりました。データの抽出や検証にはお勧めできません。従来の理由から、Goチームはデータ抽出/検証ツールにしたくないからです。 – Books