Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 정규 표현식(Regex)으로 IPv6 주소 유효성 검사하기


IP 주소가 주어졌을 때, 정규 표현식(Regex, Regular Expression)을 활용해 해당 주소가 유효한 IPv6 주소인지 판별하는 방법을 알아봅니다. 주소가 유효하면 "IPv6 Address"를 출력하고, 그렇지 않으면 "Not"을 출력합니다.

유효한 IPv6 주소는 "XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX" 형태를 따르며, 각 자리 X는 16진수(hexadecimal) 문자여야 합니다. 즉, 8개의 필드가 콜론(:)으로 구분된 구조입니다.

입력 예제 1

IP = "3001:0da8:82a3:0:0:8B2E:0270:7224"

출력

"Not"

설명 − 위 주소는 유효한 IPv6 주소가 아니므로 "Not"을 반환합니다.

입력 예제 2

IP = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"

출력

"IPv6"

설명 − 위 주소는 유효한 IPv6 주소이므로 "IPv6"를 반환합니다.

정규 표현식을 활용한 접근 방식

주어진 IP 주소가 IPv6 형식에 부합하는지 확인하기 위해 정규 표현식(Regex)을 사용합니다. 정규 표현식은 특정 패턴을 정의하는 문자들의 연속으로 이루어진 식으로, 문자열 내 패턴 매칭에 활용되며 입력값 검증(Input Validation) 분야에서도 널리 사용됩니다.

정규 표현식 기본 문법

범위 지정(Range Specification) − 대괄호 [ ]를 사용하면 매칭할 문자의 범위를 가장 간단하게 지정할 수 있습니다.

문자 지정 − 아래 표현식은 각각 소문자 a~z, 대문자 A~Z, 숫자 0~9 범위의 한 글자와 매칭됩니다.

[a-z], [A-Z], [0-9]

반복 패턴(Repeated Patterns) − 수량자(quantifier)를 사용해 패턴의 반복 횟수를 지정할 수 있습니다.

  • + : 해당 패턴이 1회 이상 반복될 때 매칭
  • * : 해당 패턴이 0회 이상 반복될 때 매칭

예를 들어 [a-z]*는 빈 문자열과도 매칭됩니다. 문자 집합이 한 번 이상 반복되어야 하는 경우에는 다음과 같이 수량자를 붙여 표현합니다.

[Abc]+

문제 해결 단계

  • IP 주소를 나타내는 문자열을 입력받습니다.
  • validIPAddress(string IP) 함수는 IP 주소를 인자로 받아 유효성을 검사한 뒤, 유효하면 "IPv6"를, 그렇지 않으면 "Not an IP Address"를 반환합니다.
  • IPv6 주소 검증용 정규 표현식 패턴을 작성합니다. IPv6 주소는 8개의 필드로 구성되며, 각 필드는 16진수 값(0~9, a~f, A~F)을 담고 콜론(:)으로 구분됩니다.
  • 유효한 IPv6 주소의 패턴은 (([0-9a-fA-F]){1,4})\:){7}([0-9a-fA-F]){1,4}) 형태입니다. 즉, 1~4자리 16진수 그룹과 콜론의 조합이 7번 반복된 후 마지막 16진수 그룹 하나로 끝나는 구조입니다.
  • 각 필드를 구성하는 문자는 모두 0~9, a~f, A~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:7224";
    string ans = validIPAddress(IP);
    cout<<ans<<endl;
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Not

입력된 IP 주소가 유효한 형식이 아니므로 "Not"이 반환됩니다.