C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の正規表現(Regex)パターンでIPv4アドレスを検証する方法


IPアドレスが与えられたとき、そのアドレスが有効なIPv4アドレスであるかどうかを正規表現(Regex)を使って検証するのが本記事の目的です。検証の結果、有効なIPv4アドレスであれば「IPv4」と出力し、そうでなければ「Not」と出力します。

有効なIPv4アドレスとは

有効なIPv4アドレスは「X1.X2.X3.X4」という形式で表され、各フィールドXiは0以上255以下の整数である必要があります。また、各フィールドには先頭に余分なゼロ(leading zeros)を含めてはいけません。例えば「192.168.1.1」や「192.168.1.0」は有効なIPv4アドレスですが、「192.168.01.1」「192.168.1.00」「192.168@1.1」などは無効です。

入力例と出力例

入力1:

IP = "172.15.254.2"

出力:

IPv4

説明:これは有効なIPv4アドレスであるため、「IPv4」を返します。

入力2:

IP = "312.25.12.1"

出力:

Not

説明:これは有効なIPv4アドレスではないため、「Not」を返します。

この問題へのアプローチ

与えられたIPアドレスがIPv4かどうかを判定するには、正規表現(Regex)を利用します。正規表現とは、特定のパターンを定義する文字列の並びのことであり、文字列内のパターンマッチングに使用されます。フォーム入力のバリデーション(検証)などにも広く活用されています。

正規表現の基本要素

範囲指定:「[ ]」(角括弧)を使うことで、マッチさせたい文字の範囲を最もシンプルに指定できます。[a-z]は小文字アルファベット、[A-Z]は大文字アルファベット、[0-9]は数字1文字にそれぞれ対応します。

繰り返しパターン:量指定子「+」は直前のパターンが1回以上連続することを、「*」は0回以上連続することを意味します。たとえば、[a-z]*は空文字列にもマッチします。

複数の文字からなるグループを1回以上繰り返してマッチさせたい場合は、括弧を使って次のように記述します。

[Abc]+

解法の手順

  • IPアドレスを表す文字列を入力として受け取ります。

  • validIPAddress(string IP) 関数がIPアドレスを受け取り、入力文字列が有効かどうかを判定します。有効なら「IPv4」を、無効なら「Not」を返します。

  • IPv4アドレス用の正規表現パターンを作成します。IPv4アドレスは4つのフィールド(オクテット)から構成され、各フィールドは0〜255の範囲の値を持ちます。全体の形は XXX.XXX.XXX.XXX のようになります。

  • 各オクテットの値域を正規表現で分解すると、次のようになります。

    • 0〜9 → [0-9]
    • 10〜99 → [1-9][0-9]
    • 100〜199 → 1[0-9][0-9]
    • 200〜249 → 2[0-4][0-9]
    • 250〜255 → 25[0-5]
  • これらを組み合わせると、最初の3つのオクテットはエスケープしたピリオド(\.)を伴って3回繰り返され、その後に最後のオクテットが続くパターンとなります。これにより、どのフィールドも255を超える数値にはマッチしなくなります。

コード例

#include<bits/stdc++.h>
using namespace std;
string validIPAddress(string IP) {
    regex ipv4("(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])");
    if(regex_match(IP, ipv4))
        return "IPv4";
    else
        return "Not";
}
int main(){
    string IP = "172.16.254.1";
    string ans = validIPAddress(IP);
    cout<<ans<<endl;
    return 0;
}

出力

上記のコードを実行すると、次の出力が得られます。

IPv4

入力されたIPアドレス「172.16.254.1」は有効なIPv4アドレスであるため、「IPv4」が返されます。

  1. C++で解くAndroidパターンロック:解除パターンの総数を求めるアルゴリズム

    問題概要 Androidスマートフォンでおなじみの3×3パターンロック画面を考えてみましょう。ここで、2つの整数 m と n(1 ≤ m ≤ n ≤ 9)が与えられます。このとき、m個以上n個以下のキーを使って描けるロック解除パターンの総数を求めるのが本記事の目的です。 パターンのルール 各パターンは、少なくともm個、最大でもn個のキーを結ぶ必要があります。 同じキーを複数回使うことはできません(すべてのキーは一意)。 パターン内で連続する2つのキーを結ぶ直線が別のキーの上を通る場合、その通過されるキーはすでに選択済みでなければなりません。 未選択のキーをまたいで「ジャンプ」することは禁止

  2. 【Python】正規表現(Regex)で文字列内の「1(0+)1」パターンをすべて検索する方法

    このチュートリアルでは、Pythonの正規表現(regex)を使って、文字列内に含まれる「1(0+)1」というパターンをすべて検出するプログラムを作成します。Pythonには正規表現を扱うためのreモジュールが標準で用意されており、これを活用することでパターンマッチングを簡単に実装できます。 サンプルケース まず、どのような動作になるのかサンプルを見てみましょう。 入力:string = Sample 1(0+)1 string with 1(0+)1 unnecessary patterns 1(0+)1出力:パターンの一致数:3件[1(0+)1, 1(0+)1, 1(0+)1] それでは、