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」が返されます。
-
C++で解くAndroidパターンロック:解除パターンの総数を求めるアルゴリズム
問題概要 Androidスマートフォンでおなじみの3×3パターンロック画面を考えてみましょう。ここで、2つの整数 m と n(1 ≤ m ≤ n ≤ 9)が与えられます。このとき、m個以上n個以下のキーを使って描けるロック解除パターンの総数を求めるのが本記事の目的です。 パターンのルール 各パターンは、少なくともm個、最大でもn個のキーを結ぶ必要があります。 同じキーを複数回使うことはできません(すべてのキーは一意)。 パターン内で連続する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] それでは、