C++ Chapter 18.5 : 정규 표현식 소개

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 18. 입력과 출력

정규 표현식 소개

#include <regex> C++ 11부터 사용 가능하다.

입력한 문자열이 이메일 주소 형식에 맞는지, 전화번호 형식에 맞는지, 우편번호 형식에 맞는지 등등 어떤 입력 문자열이 원하는 형식에 맞춰져 있는지를 검사할 수 있다.

🔔 regex

regex 인스턴스를 생성하여 생성자에 검사할 형식을 인수로 넘긴다.

  • 예시
    • regex re("\\d")
      • re는 십진수 숫자 하나 d를 입력받는 정규식 인스턴스가 된다.
      • 첫 번째 \
        • 뒤에 있는 \가 진짜 \역슬래시 라는 의미
      • \d
        • digit 인가를 판별 (\n \t 같은 것)
      • "\\d"는 정규식이 된다.
      • 참고 http://www.cplusplus.com/reference/regex/ECMAScript/
  • - std::regex_match(str, re)
    • 검사할 형식으로 초기화한 regex 타입의 인스턴스인 restr비교하여 올바른 형식인지 검사 후 true, false 를 리턴하는 함수이다.
    • 즉 정규식 패턴이 입력된 문자열 str에 존재하는지 검사.
#include <iostream>
#include <regex>  // ⭐⭐

using namespace std;

int main()
{
    regex re("\\d");
    
    string str;
    
    while (true)
    {
        getline(cin, str);   
        
        if (std::regex_match(str, re))
            cout << "Match" << endl;
        else
            cout << "No Match" << endl;
        
				// 반복자를 이용하여 검사한 후 매치하는 부분만 출력
        {
            auto begin = std::srgex_iterator(str.begin(), str.end(), re);
            auto end = std::srgex_iterator();
            for (auto itr = begin; itr != end; ++itr)
            {
                std::smatch match = *itr;
                cout << match.str() << " ";
            }
            cout << endl;
        }
        cout << endl;
    }

    return 0;
}
💎입력💎
0

123

01234


💎출력💎
Match
0

No Match
1 2 3

No Match
0 1 2 3 4
  • 반복자를 이용하여 검사한 후 정규식과 입력한 문자열이 매치되는 부분만 출력
    • regex_iterator 클래스
      • 매치되는 항목에 대한 반복자 클래스
      • auto begin = std::srgex_iterator(str.begin(), str.end(), re)
        • str의 첫 글자부터 마지막 글자까지의 범위 중에서
        • 정규식 re와 매치 되는 첫 위치의 반복자를 리턴
      • auto end = std::srgex_iterator();
        • std::srgex_iterator()
          • 이렇게 인수를 아무것도 넘기지 않으면 끝 반복자 위치 리턴. end()
      • for문
        • str을 반복자 begin 부터 end까지 검사한다.
        • std::smatch match = *itr;
          • 한 글자 *itr 씩 정규식에 매칭되는지 검사
          • std::smatch는 검색의 결과다. 정규식 검색 이후 결과 (매칭되는 글자)를 match에 저장
        • match.str()
          • match에 들어있는 문자열을 다 꺼내어 리턴
          • 한글자씩 정규식 검색 이후 결과를 리턴
  • 입력 예시
    • 현재 정규식 re\\d십진수 1 개만 입력해야 한다.
    • 1️⃣ 0 입력시
      • regex_match 결과 true라서 “Match” 출력
      • for문 돌면서 한 글자씩 정규식에 부합하는 글자 출력 👉 0 출력
    • 2️⃣ 123 입력
      • regex_match 결과 false라서 “No Match” 출력. (숫자가 여러개라 false)
      • for문 돌면서 한 글자씩 정규식에 부합하는 글자 출력 👉 1 2 3
        • 한 글자씩 뜯어볼땐 부합하긴 한다… 숫자 1개


🔔 정규식 형식

image

image

  • \\d : 숫자 1개만 받아야 OK
    • \\d+ : 숫자 1개 이상이면 OK
    • \\d* : 숫자 0개 이상이면 OK
    • \\d? : 숫자 0개 혹은 1개여야 OK
  • \d[:digit:] 는 같은 의미.
    • \\d[[:digit:]] 와 같은 의미. 가장 바깥 대괄호는 안에 있는 것’만’ 괜찮다는 의미.
    • [:digit:] 만 괜찮다 ! 숫자만 된다.
    • regex regExp("[[:digit:]]{3}") : 숫자 딱 3개만 입력받아야 OK
      • 0~9 숫자 중 딱 3개 입력 들어오면 OK
      • 456 : OK 7894 : not OK
  • regex re("[ab]")
    • a나 b만 된다. 각 1개씩만.
      • a : OK
      • b : OK
      • ab : not OK
      • c : not OK
  • regex re("[A-Z]+");
    • ‘A’ 부터 ‘Z’ 까지의 문자가 1개 이상이면 OK
  • regex re("[A-Z]{1,5}");
    • ‘A’ 부터 ‘Z’ 까지의 문자가 최소 1개 최대 5개면 OK
  • regex regExp(" ( [0-9] {1} ) ( [-]? ) ( [0-9] {1, 4} )");
    • #-#### 형식
    • 0 ~ 9 의 숫자는 반드시 1개만 있어야 하고
      • 는 1개 있거나 없어야 하고
    • 0~9 숫자는 최소 1개 최대 4개 있어야 한다.
    • Match Ok 예시
      • 3-789
      • 78
      • 78978
      • 6-87
    • Match not OK 예시
      • 32-78
        • 앞 숫자 반드시 1개 있어야 한다는거 초과
      • 3-78948498
        • 뒷 숫자 반드시 1~4개 있어야 한다는거 초과
      • 3——-78
        • - 는 0개 or 1개 있어야 한다는거 위반
    • 이메일 정규식 되게 복잡하던데 한번 다음에 구글링 해보자


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기