golang で正規表現を使用して、入力が IPv4 アドレスであるか IPv6 アドレスであるかを確認する

WBOY
リリース: 2023-06-24 13:34:40
オリジナル
1923 人が閲覧しました

近年、インターネットの普及と応用シナリオの拡大に伴い、プログラム開発に GO 言語を使用する開発者が増えています。 GO 言語では、正規表現を使用して入力が正当かどうかを確認することが非常に一般的な要件です。その中で、入力が IPv4 アドレスであるか IPv6 アドレスであるかを確認することは、共通の要件の 1 つです。この記事では、GO 言語で正規表現を使用して、入力が IPv4 アドレスであるか IPv6 アドレスであるかを確認する方法を紹介します。

IPv4 アドレス (インターネット プロトコル バージョン 4 アドレスとも呼ばれる) は 32 ビットの 2 進数で、通常は各数値が「.」で区切られた 4 つの 10 進数で表されます。たとえば、192.168.0.1 は有効な IPv4 アドレスです。

IPv6 アドレス (インターネット プロトコル バージョン 6 アドレスとも呼ばれる) は 128 ビットの 2 進数で、通常は 8 つの 16 進数のグループとして表され、各グループの間には「:」が含まれます。たとえば、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 であることを示し、括弧は完全なアドレスセグメントを示します。 。正規表現は各アドレス セグメントを左から右に 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]))$
ログイン後にコピー

も各アドレス セグメントを左から右に 1 つずつ照合しますが、IPv6 アドレスの形式は IPv4 アドレスよりもはるかに複雑です。有効な IPv6 アドレスは、次のいずれかの形式で構成できます。

  • 0 から ffff までの 8 つの 16 進数。各 2 つの数字の間は「:」で区切られます。
  • 8 つの 16 進数0 から ffff まで、2 つの数字はそれぞれ「:」で区切られますが、最後の数字は省略できます;
  • 0 から ffff までの 1 つ以上の数字 ffff の 16 進数は、それぞれの 2 つの間を「:」で区切ります数字と「::」を使用して省略形を表すことができます。この略語は 1 回のみ使用でき、最初または最後の段落には使用できません;
  • 特別な 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 アドレスの正当性を検証することは、正規表現によって実現できます。上記2つのアドレスの検証方法を紹介しましたので、開発のお役に立てれば幸いです。同様の問題が発生した場合は、この記事のコード例と正規表現を参照して、検証を迅速に実装できます。

以上がgolang で正規表現を使用して、入力が IPv4 アドレスであるか IPv6 アドレスであるかを確認するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!