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

C++ 정규식(Regex) 패턴으로 IPv4 주소 유효성 검사하기


IP 주소가 주어졌을 때, 정규식(Regular Expression, Regex)을 활용하여 해당 주소가 유효한 IPv4인지 검증하는 방법을 알아보겠습니다. IP 주소가 유효하면 "IPv4 Address"를 출력하고, 그렇지 않으면 "Not"을 출력합니다.

유효한 IPv4 주소는 X1.X2.X3.X4 형태를 따르며, 각 자리(Xi)는 0 ≤ Xi ≤ 255 범위를 만족해야 하고 불필요한 선행 0을 포함할 수 없습니다. 예를 들어 "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"

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

예시 2

IP = "312.25.12.1"

출력 −

"Not"

설명 − 첫 번째 필드가 255를 초과하므로 유효한 IPv4 주소가 아니며 "Not"을 반환합니다.

문제 해결 접근법

주어진 IP 주소가 IPv4 형식에 맞는지 확인하기 위해 정규식(Regex)을 사용합니다. 정규식은 특정 패턴을 정의하는 문자들의 시퀀스로, 문자열 안에서 해당 패턴과 일치하는 부분을 찾아내는 데 활용되며 입력값 검증(Input Validation)에도 널리 사용됩니다.

정규식을 작성할 때 필요한 기본 문법은 다음과 같습니다.

  • 범위 지정([ ]): 대괄호 안에 문자나 범위를 명시하여 패턴을 정의합니다. [a-z], [A-Z], [0-9]는 각각 소문자, 대문자, 숫자 한 글자와 일치합니다.
  • 반복 지정(+, *): '+'는 해당 패턴이 한 번 이상 반복됨을, '*'는 0번 이상 반복됨을 의미합니다. 예를 들어 [a-z]*는 빈 문자열과도 일치합니다.
  • 그룹화(( )): 여러 문자를 하나의 그룹으로 묶어 반복 규칙을 적용할 때 괄호를 사용합니다. 예: [Abc]+ 는 A, b, c 중 하나 이상의 연속된 문자와 일치합니다.

단계별 풀이

  1. IP 주소를 나타내는 문자열을 입력받습니다.
  2. validIPAddress(string IP) 함수가 입력 문자열의 유효성을 검사하여, 유효하면 "IPv4", 그렇지 않으면 "Not"을 반환하도록 합니다.
  3. IPv4 주소는 4개의 필드(옥텟)로 구성되며 각 필드는 0~255 사이의 값을 가집니다. 즉 XXX.XXX.XXX.XXX 형태입니다.
  4. 0~255 범위는 다음과 같이 정규식으로 분해할 수 있습니다.
    • [0-9] : 0~9 (한 자리 수)
    • [1-9][0-9] : 10~99 (두 자리 수, 선행 0 제외)
    • 1[0-9][0-9] : 100~199
    • 2[0-4][0-9] : 200~249
    • 25[0-5] : 250~255
  5. 위 다섯 가지 패턴을 OR 연산자(|)로 연결하면 0~255 범위를 표현하는 하나의 패턴이 됩니다. 여기에 마침표를 붙인 형태를 3회 반복하고({3}), 마지막 필드를 한 번 더 추가하면 완전한 IPv4 패턴이 완성됩니다. 단, 점(.)은 임의의 문자와 매칭되는 메타문자이므로 역슬래시(\.)로 이스케이프해야 합니다.

구현 코드 (C++)

#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"를 출력합니다. 참고로 regex_match() 함수는 전체 문자열이 패턴과 완전히 일치할 때만 true를 반환하므로, 부분 일치가 아닌 전체 형식 검증에 적합합니다.