近年來,隨著網路的普及和應用場景的擴展,越來越多的開發人員開始使用GO語言進行程式開發。在GO語言中,使用正規表示式驗證輸入是否合法是非常常見的需求。而其中,驗證輸入是否為IPv4或IPv6位址更是常見需求之一。本文將介紹如何在GO語言中使用正規表示式驗證輸入是否為IPv4或IPv6位址。
IPv4位址,也稱為Internet協定第四版位址,它是一個32位元的二進位數,通常被表示為四個十進制數,每個數之間用「.」分開。例如,192.168.0.1 是一個合法的IPv4位址。
IPv6位址,也稱為Internet協定第六版位址,它是一個128位元的二進制數,通常被表示為一組八個十六進制數,每組之間用“:”分開。例如,2001:0db8:85a3:0000:0000:8a2e:0370:7334 是合法的IPv6位址。
下面,我們將分別介紹如何使用正規表示式驗證IPv4和IPv6位址。
驗證IPv4位址
在GO語言中,可以使用正規表示式驗證IPv4位址是否合法。 IPv4位址的正規表示式如下:
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
其中,方括號表示可選項,問號表示可選項出現的次數為0或1,小括號表示一個完整的位址段。正規表示式從左到右逐一匹配每個位址段,每個位址段都是由0到255之間的數字組成。當全部位址段都符合成功時,整個正規表示式認為匹配成功,否則認為匹配失敗。
接下來,我們透過範例程式碼來示範如何使用正規表示式驗證IPv4位址的合法性。
package main import ( "fmt" "regexp" ) func main() { ipv4Regex := `^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$` ipv4Address1 := "192.0.2.1" ipv4Address2 := "255.255.255.255" ipv4Address3 := "256.0.0.1" match1, _ := regexp.MatchString(ipv4Regex, ipv4Address1) match2, _ := regexp.MatchString(ipv4Regex, ipv4Address2) match3, _ := regexp.MatchString(ipv4Regex, ipv4Address3) fmt.Println("IPv4 address 1 is valid: ", match1) fmt.Println("IPv4 address 2 is valid: ", match2) fmt.Println("IPv4 address 3 is valid: ", match3) }
輸出結果:
IPv4 address 1 is valid: true IPv4 address 2 is valid: true IPv4 address 3 is valid: false
從輸出結果可以看到,IPv4位址1和IPv4位址2都是合法的IPv4位址,而IPv4位址3不是合法的IPv4位址。
驗證IPv6位址
與驗證IPv4位址相比,驗證IPv6位址的正規表示式略微複雜一些。 IPv6位址的正規表示式如下:
^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:([0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$
同樣是從左到右逐一符合每個位址段,但IPv6位址的格式比IPv4位址複雜得多。一個有效的IPv6位址可以由以下幾種形式之一組成:
接下來,我們同樣透過範例程式碼來示範如何使用正規表示式驗證IPv6位址的合法性。
package main import ( "fmt" "regexp" ) func main() { ipv6Regex := `^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:([0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$` ipv6Address1 := "2001:0db8:85a3:0000:0000:8a2e:0370:7334" ipv6Address2 := "2001:db8::1" ipv6Address3 := "2001:db8:::1" ipv6Address4 := "ff02::2" ipv6Address5 := "fe80::1%eth0" ipv6Address6 := "fe80::1234:5678:9abc:def0%3" ipv6Address7 := "::ffff:192.0.2.128" ipv6Address8 := "0:0:0:0:0:0:0:1" match1, _ := regexp.MatchString(ipv6Regex, ipv6Address1) match2, _ := regexp.MatchString(ipv6Regex, ipv6Address2) match3, _ := regexp.MatchString(ipv6Regex, ipv6Address3) match4, _ := regexp.MatchString(ipv6Regex, ipv6Address4) match5, _ := regexp.MatchString(ipv6Regex, ipv6Address5) match6, _ := regexp.MatchString(ipv6Regex, ipv6Address6) match7, _ := regexp.MatchString(ipv6Regex, ipv6Address7) match8, _ := regexp.MatchString(ipv6Regex, ipv6Address8) fmt.Println("IPv6 address 1 is valid: ", match1) fmt.Println("IPv6 address 2 is valid: ", match2) fmt.Println("IPv6 address 3 is valid: ", match3) fmt.Println("IPv6 address 4 is valid: ", match4) fmt.Println("IPv6 address 5 is valid: ", match5) fmt.Println("IPv6 address 6 is valid: ", match6) fmt.Println("IPv6 address 7 is valid: ", match7) fmt.Println("IPv6 address 8 is valid: ", match8) }
輸出結果:
IPv6 address 1 is valid: true IPv6 address 2 is valid: true IPv6 address 3 is valid: false IPv6 address 4 is valid: true IPv6 address 5 is valid: true IPv6 address 6 is valid: true IPv6 address 7 is valid: true IPv6 address 8 is valid: true
從輸出結果可以看到,IPv6位址1到IPv6位址8都是合法的IPv6位址。
總結
在GO語言中使用正規表示式驗證IPv4或IPv6位址的合法性,可以透過正規表示式實現。我們已經介紹了以上兩種地址的驗證方法,希望對您的開發有所幫助。遇到類似的問題時,可以參考本文的程式碼範例和正規表示式,快速實現驗證。
以上是golang中使用正規表示式驗證輸入是否為IPv4或IPv6位址的詳細內容。更多資訊請關注PHP中文網其他相關文章!