예제를 통해 c++에서 정규표현식 사용법을 익힌다.
정규표현식은 문자열이 주어졌을 때 원하는 패턴의 문자열을 검색하거나 치환할 때 사용한다.
string 사용과 정규표현식 사용 등을 별개로 익히는 건 학습에 도움이 많이 안된다고 생각하여 하나의 예제를 통해 이를 분석해보는 방식을 통해 정규표현식을 익혀보자.
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()를 통해 원하는 문자로 치환하였다.
위 예제에서 사용한 정규표현식에 관련된 객체 및 함수는 아래와 같다.
std::regex는 찾고자 하는 문자열 매칭에 사용된 객체이다. 문자열 매칭에 관한 정규표현식은 추후 포스팅할 것이다.
std::smatch는 주어진 string 문자열에서 std::regex문자열과 매칭하여 매치된 문자열 std::string 형태로 돌려준다. 그래서 함수 std::regex_searsh(format, smatch, regex)를 통해 검색하여 regex_searsh가 true이면 매칭된 문자열이 존재하는 것이고 smatch에 해당 문자열이 저장되어 있다.