정규 표현식

개발을 하다보면 email유효성을 체크한다던지, 닉네임 유효성을 체크한다던지 할 일이 생긴다.

그 때 사용할 수 있는게 정규 표현식이다. c++에서는 regex 헤더에서 사용할 수 있다.

#include <regex>

 

사용법은 간단하다. 정규 표현식으로 regex 객체를 만들고, regex_match함수로 확인하려는 문자열이 정규표현식으로 설정한 패턴에 맞는지 틀린지 확인한다.

아래는 내가 만든 이메일 정규표현식이다.

R"([a-zA-Z0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z]{2,}){1,2})"

 

R"(어쩌구)" 문자열은 c언어의 RawString 문법이다 아래 글 참조.

https://dodontak.tistory.com/269

이 난해해 보이는 문자열이 정확히 무슨 의미인지는 예시코드를 보고난 뒤에 확인하자.

 

예시 코드

#include <iostream>
#include <string>
#include <regex>

using namespace std;

int main()
{
	string	validemail_1 = "dodontak@naver.com";
	string	validemail_2 = "dodontak@korea.co.kr";

	string	wrongemail_1 = "dodontak@naver.";
	string	wrongemail_2 = "@naver.com";
	string	wrongemail_3 = "dodontak@naver";
	string	wrongemail_4 = "dodontak@naver.c";
	string	wrongemail_5 = "dodontak.naver.com";

	const regex	pattern(R"([a-zA-Z0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z]{2,}){1,2})");

	cout << validemail_1 << ": " << regex_match(validemail_1, pattern) << endl;
	cout << validemail_2 << ": " << regex_match(validemail_2, pattern) << endl;
	cout << wrongemail_1 << ": " << regex_match(wrongemail_1, pattern) << endl;
	cout << wrongemail_2 << ": " << regex_match(wrongemail_2, pattern) << endl;
	cout << wrongemail_3 << ": " << regex_match(wrongemail_3, pattern) << endl;
	cout << wrongemail_4 << ": " << regex_match(wrongemail_4, pattern) << endl;
	cout << wrongemail_5 << ": " << regex_match(wrongemail_5, pattern) << endl;
}

 

정규 표현식 해석

나도 아주 자세히 알진 않으니, 딱 내가 쓸 정규표현식을 만들면서 알게된 것만 정리해봤다.

R"([a-zA-Z0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z]{2,}){1,2})"

이문자열을 뜯어보자. 일단 R"()"은 c++에서 rawstring을 쓰려고 넣은 부분이니 빼자.

[a-zA-Z0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z]{2,}){1,2}
  • [a-zA-Z0-9]+
  • @
  • [a-zA-Z0-9]+
  • (\.[a-zA-Z]{2,}){1,2}

크게 이렇게 4덩어리로 나누어 볼 수 있다.

이를 좀 더 자세히 설명해보면

  • [a-zA-Z0-9]+
    [a-zA-Z0-9] : 영문, 숫자로 된 문자열이
    + : 1자 이상 들어가야함
  • @ : 그 뒤에 골뱅이가 들어가야함
  • [a-zA-Z0-9]+ : 그 뒤에 영문, 숫자로 된 문자열이 1자 이상 들어가야함
  • (~~~~~~~){1,2} : 한 덩어리의(그룹화 된) 패턴이 1개에서 2개 들어가야함 (.com 이나 .co.kr 을 ok하기 위해서 넣)
  • 괄호 안 내용
    \. : 맨앞에 마침표가 있어야함 마침표 앞에 \가 있는 이유는 .이 정규 표현식에서 "아무 문자 하나" 라는 의미의 메타문자이기 때문에 이스케이프 문자 \를 사용해 아무 문자를 말하는게 아니라 진짜 마침표를 말한다고 표시하는 것이다.
    [a-zA-Z]{2,} : 그 뒤에 영문으로 된 2자 이상의 문자열이 나와야함.

이렇게 된걸 한글로 풀어 쓰면 이렇다.

1. (영문, 숫자로 된 1자 이상의 문자열)
2. @
3. (영문, 숫자로 된 1자 이상의 문자열)
4. (마침표로 시작한 뒤 영문이 2자 이상쓰여진 문자열이 1개 혹은 2개 있어야함)

만든 정규표현식이 제대로 돌아가는지 반드시 테스트를 통해 확인해봐야 한다.

  • +는 사실상 {1,} 과 같다. 이것들을 수량자라 하는데 + 외에도 *, ?이 있다.
    *은 {0,} 과 같고, ?은 {0,1}과 같다.

이외에도 여러 문법, 메타문자가 있는데 다 외우는건 불가능에 가깝고 필요할때마다 찾아보는게 맞는 것 같다.

'공부 > C\C++' 카테고리의 다른 글

jwt-cpp 사용하기 with.C/C++  (0) 2026.03.14
c++ friend  (0) 2025.07.24
c++ 중괄호 초기화 Brace initialization  (0) 2025.07.13
c union  (0) 2025.07.05
c++ placement new  (0) 2025.07.04

+ Recent posts