C++の正規表現(Regex)パターンでIPv6アドレスを検証する方法
IPアドレスが与えられたとき、正規表現(Regex)を利用して、そのアドレスが有効なIPv6アドレスかどうかを検証することを考えます。検証の結果、有効なIPv6アドレスであれば「IPv6 Address」を、そうでなければ「Not」を出力します。
有効なIPv6アドレスとは、「XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX」という形式で表されるIPアドレスのことです。ここで各「X」は16進数の1桁(0〜9、a〜f、A〜F)を表し、合計8つのフィールドがコロン(:)で区切られています。
入力例1
IP = "3001:0da8:82a3:0:0:8B2E:0270"
出力
"Not"
解説:この文字列はフィールドが7つしかなく、IPv6アドレスに必須な8つのフィールドを満たしていません。したがって有効なIPv6アドレスではないため、「Not」を返します。
入力例2
IP = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
出力
"IPv6"
解説:これは有効なIPv6アドレスであるため、「IPv6」を返します。
正規表現による解決アプローチ
与えられたIPアドレスがIPv6かどうかを判定するには、正規表現(Regex)を使用します。正規表現とは、特定のパターンを定義する一連の文字で構成される式のことで、文字列の中からパターンに一致する部分を探す処理に利用できます。入力値のバリデーション(検証)の場面でも広く使われている手法です。
範囲の指定:もっともシンプルな方法として、角括弧「[ ]」を使うことで、マッチさせたい文字の範囲を指定できます。
文字の指定:たとえば次の式は、それぞれ「a〜z」「A〜Z」「0〜9」のいずれか1文字に一致する正規表現です。
[a-z]、[A-Z]、[0-9]
繰り返しパターン:修飾子「+」は直前のパターンが1回以上繰り返されることを、「*」は0回以上繰り返されることを意味します。たとえば [a-z]* は空文字列にも一致します。
複数の文字からなるグループを1回以上繰り返してマッチさせたい場合は、丸括弧を組み合わせて次のように記述します。
[Abc]+
問題を解くための手順
IPアドレスを表す文字列を入力として受け取ります。
文字列関数 validIPAddress(string IP) がIPアドレスを引数として受け取り、入力文字列が有効かどうかを判定します。有効であれば「IPv6」を、無効であれば「Not」を返します。
IPv6アドレス用の正規表現パターンを作成します。IPv6アドレスは8つのフィールドから構成され、各フィールドには16進数で表された値が入り、フィールド同士はコロンで区切られます。
有効なIPv6アドレスのパターンは「(([0-9a-fA-F]){1,4}\:){7}([0-9a-fA-F]){1,4}」のように表せます。各フィールドは1〜4桁の16進数字(0〜9、a〜f、A〜F)で構成され、最初の7つのフィールドにはそれぞれ末尾にコロンが続きます。
同様に、各フィールドを構成する文字はすべて「0-9a-fA-F」の範囲に含まれる必要があるため、正規表現上の文字クラスは「[0-9a-fA-F]」となります。
実装例
#include<bits/stdc++.h>
using namespace std;
string validIPAddress(string IP) {
regex ipv6("((([0-9a-fA-F]){1,4})\\:){7}([0-9a-fA-F]){1,4}");
if(regex_match(IP, ipv6))
return "IPv6";
else
return "Not";
}
int main(){
string IP= "3001:0da8:82a3:0:0:8B2E:0270";
string ans= validIPAddress(IP);
cout<<ans<<endl;
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます。
Not
入力されたIPアドレスはフィールド数が不足しており、有効なIPv6アドレスではないため、「Not」が返されます。
-
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] それでは、