[C++] 정규 표현식 (Regualar Expreesion)

chooha·2025년 1월 10일

C++

목록 보기
6/23

1. 개념

문자열을 검색하거나 대체하는 데 사용되는 패턴

  • 특정 패턴을 가진 문자열을 찾을 때
  • 문자열을 분리하거나 대체할 때
  • 데이터 유효성 검사

2. 기본 문법

▸ 메타 문자

  • .
    임의의 한 문자를 나타냄
    ex) a.c는 "abc", "a9c", "a#c" 등과 일치

  • *
    앞의 요소가 0번 이상 반복됨을 나타냄
    ex) a*는 "", "a", "aa", "aaa" 등과 일치

  • +
    앞의 요소가 1번 이상 반복됨을 나타냄
    ex) a+는 "a", "aa", "aaa" 등과 일치

  • ?
    앞의 요소가 0번 또는 1번 나타남을 나타냄
    ex) a? "", "a" 와 일치

  • ∖∖d
    숫자를 나타냄
    "0"에서 "9"까지의 어떤 숫자와도 일치

  • ∖∖w
    "word character"를 나타냄
    알파벳, 숫자, 밑줄(_)과 일치

  • ∖∖s
    공백문자를 나타냄
    탭, 캐리지 리턴, 줄 바꿈, 공백 등과 일치

  • ∖∖b
    단어 경계를 나타냄
    단어의 시작과 끝을 구분

  • [...]
    대괄호 안의 어떤 문자와도 일치
    [abc]는 "a", "b", "c"와 일치

  • [^...]
    대괄호 안의 문자를 제외한 어떤 문자와도 일치
    [^abc]는 "a", "b", "c"를 제외한 모든 문자와 일치

  • ^
    문자열 또는 줄의 시작을 나타냄
    ^a는 "a"로 시작하는 문자열과 일치

  • $
    문자열 또는 줄의 끝을 나타냄
    $a는 "a"로 끝나는 문자열과 일치

▸ 예제

  • (100+1+ | 01)+
    - 100+
    100뒤에 0이 하나 이상 나오는 문자열
    ex) 1000, 10000
    - 1+
    1이 하나 이상 나오는 문자열
    ex) 11, 1111
    - 100+1+
    100뒤에 0이 하나 이상 있고, 그 뒤에 1이 하나 이상 있는 문자열
    ex) 1000011
    - 100+1+ | 01
    100+1+ 패턴이나 01 패턴 중 하나
    ex) 10001111, 01
    - (100+1+ | 01)+
    위 패턴이 하나 이상 반복되는 문자열
    ex) 100011110101, 01100001101

  • ∖∖b010-∖∖d{4}-∖∖d{4}∖∖b
    - ∖∖b010-
    문자열이 010-로 시작한다는 의미
    이는, 010-이 다른 숫자 또는 문자에 의해 중간에 끼여있지 않음을 보장
    - ∖∖d{4}
    4자리의 숫자를 의미
    - ∖∖b
    문자열의 끝을 의미


3. 기능

▸ 문자열 매칭 (regex_match)

#include <iostream>
#include <regex>

using namespace std;

bool matchWord(const string& password)
{
	regex e("\\b452~\\d{3}!135+");
    return regex_match(password, e);
}

int main()
{
	string input;
    cout << "입력 : ";
    cin >> input;
    
    if(matchWord(input))
    	cout << "암호 입력에 성공하였습니다.\n";
    else
    	cout << "암호 입력에 실패하였습니다.\n";
        
	return 0;
}


#include <iostream>
#include <regex>

using namespace std;

int main()
{
	string input;
    cout << "입력 : ";
    getline(cin, input);
    
    regex e("\\w+bug~+");
    regex_iterator<string::iterator> rit(input.begin(), input.end(), e);
    regex_iterator<string::iterator> rend;
    
    while(rit != rend)
    {
    	cout << rit->str() << endl;
        ++rit;
    }
        
	return 0;
}


▸ 문자열 대체 (regex_replace)

#include <iostream>
#include <regex>

using namespace std;

int main()
{
	string input, tmp;
    cout << "입력 : ";
    getline(cin, input);
    
    cout << "대체할 단어 : ";
    cin >> tmp;
    
    regex e("\\w+bug~+");
    string result;
    
    regex_replace(back_inserter(result), input.begin(), input.end(), e, tmp);
    cout << result;
        
	return 0;
}


< 참고 자료 >

정규 표현식

0개의 댓글