首頁 > 後端開發 > Golang > 主體

golang中使用正規表示式驗證輸入是否為IPv4或IPv6位址

WBOY
發布: 2023-06-24 13:34:40
原創
1845 人瀏覽過

近年來,隨著網路的普及和應用場景的擴展,越來越多的開發人員開始使用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位址可以由以下幾種形式之一組成:

  • 八個由0到ffff的十六進位數,每兩個數之間使用":"分隔;
  • 八個由0到ffff的十六進位數,每兩個數之間使用":"分隔,但最後一個數可以省略;
  • 一個或多個由0到ffff的十六進位數,每兩個數之間使用":"分隔,並且可以使用"::"表示縮寫。這種縮寫只能出現一次,且不能出現在第一段和最後一段;
  • 特殊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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!