c++ 정규표현식

gyubong park·2022년 1월 24일
0

예제를 통해 c++에서 정규표현식 사용법을 익힌다.

정규표현식은 문자열이 주어졌을 때 원하는 패턴의 문자열을 검색하거나 치환할 때 사용한다.
string 사용과 정규표현식 사용 등을 별개로 익히는 건 학습에 도움이 많이 안된다고 생각하여 하나의 예제를 통해 이를 분석해보는 방식을 통해 정규표현식을 익혀보자.

1. 예제코드 분석

string 검색 예제

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

std::string find(const std::string& s){
    return s == "%l" ? "L" : "F";
}

int main() {
    std::string newString = "";
    std::string format = "pattern: %l $1 %f &2";
    std::string rawString;

    while (!format.empty())
    {
        auto pos = format.find('%');
        if (pos != std::string::npos)
        {
            rawString += format.substr(0, pos);
            format = format.substr(pos);

            std::regex e{"^\\%[a-zA-Z0-9\\-_]+"}; // %l 문자만을 치환해 줌
            std::smatch m;
            if (std::regex_search(format, m, e))
            {
                // smatch m에 찾은 문자가 존재
                if (!rawString.empty())
                {
                    newString += rawString;
                    rawString.clear();
                }
                auto placeholder = m[0];
                newString += find(placeholder);

                // 찾은 문자열 뒤의 문자를 원본 문자로
                format = m.suffix().str();
            }
            else
            {
                rawString += '%';
                format = format.substr(1);
            }
        }
        else
        {
            // 남은것들은 rawString에 넣어줌
            rawString += format;
            break;
        }
    }
    if(!rawString.empty()){
        // loop 후 남은 것들을 넣어줌
        newString += rawString;
    }

    std::cout << "최종 newString : " << newString << std::endl;
    return 0;
}

위 예제는 string "pattern: %l $1 %f &2"에서 %로 시작하는 문자를 골라 "pattern: L $1 F &2"로 치환하는 예제이다.

코드를 보면 while문을 통해 계속 반복해주다가 std::string.find(char c)를 통해 원하는 char인 '%'를 더 이상 못 찾으면 반복문을 종료한다.

여기서 '%'뒤에 어떠한 문자도 올 수 있기에 '%' 앞은 원본을 유지하고 그 뒤부터 정규표현식을 통해 값을 가져오고 이를 사용자 정의 함수인 find()를 통해 원하는 문자로 치환하였다.

2. 정규표현식의 사용법

위 예제에서 사용한 정규표현식에 관련된 객체 및 함수는 아래와 같다.

  • std::regex
  • std::smatch
  • std::regex_search()

std::regex는 찾고자 하는 문자열 매칭에 사용된 객체이다. 문자열 매칭에 관한 정규표현식은 추후 포스팅할 것이다.
std::smatch는 주어진 string 문자열에서 std::regex문자열과 매칭하여 매치된 문자열 std::string 형태로 돌려준다. 그래서 함수 std::regex_searsh(format, smatch, regex)를 통해 검색하여 regex_searsh가 true이면 매칭된 문자열이 존재하는 것이고 smatch에 해당 문자열이 저장되어 있다.

profile
초보 개발자

0개의 댓글