정규표현식(Regular Expression) on C++

* C++ Regex

2011년 경 C++의 새로운 표준 C++11 (C++0x)을 정의하는 과정에서 Boost.Regex가 표준으로 포함되었다. C++11의 정규표현식 라이브러리는 <regex> 헤더에 정의되어 있다.이로 인해 별도의 라이브러리를 설치하지 않고도 손쉽게 정규표현식 기능을 활용할 수 있게 되었다. 최신 버전의 Visual C++, GNU C++ 컴파일러는 std::regex를 포함한 C++11 표준이 정의한 대부분의 기능을 지원한다. 컴파일러별 C++11 표준 지원에 대한 자세한 리스트는 C++0xCompilerSupport (영문) 문서를 참고.

VS 2012: 지원
GCC 버전 4.8: 미지원

 

 

예제
std::regex를 사용하기 위해서는 먼저 정규표현식 문자열을 인자로 std::regex 객체를 생성한 뒤, 검사하고자 하는 문자열이 정규표현식에 정확히 일치하는지를 알아볼 때는 std::regex_match, 문자열이 정규표현식에 부합되는 부분을 포함하고 있는지를 알아볼 때는 std::regex_search를 사용하면 된다.
다음은 입력받은 값이 “hello”인지를 확인하는 코드이다.
// 이 코드는 regex 사용을 보여주기 위한 예제일 뿐,
// 단순 문자열 비교의 경우엔 strcmp 같은 CRT 함수를 사용하는 것이 낫습니다.
#include <regex>
#include <iostream>
#include <string>

int main()
{
std::regex rx(“hello”);
std::regex exit(“exit”);
std::string s;

std::getline(std::cin, s);
while(false == std::regex_match(s, exit))
{
if(std::regex_match(s, rx))
std::endl(std::cout << “match”);
else
std::endl(std::cout << “mismatch”);

std::getline(std::cin, s);
}
}
다음은 ID 값이 영문 또는 숫자 4~20 글자에 해당하는지 확인하는 코드이다.
#include <regex>
#include <iostream>
#include <string>

int main()
{
std::regex rx(“^[a-z0-9A-Z]{4,20}+$”);
std::regex exit(“exit”);
std::string s;

std::getline(std::cin, s);
while(false == std::regex_match(s, exit))
{
if(std::regex_match(s, rx))
std::endl(std::cout << “valid”);
else
std::endl(std::cout << “invalid”);

std::getline(std::cin, s);
}
}

 

만약 검색한 글자를 포함하여 뭔가를 추가 해서 replace하고 싶다면?
즉, [0-9].bmp 라는 패턴을 찾아서 d:/[0-9].bmp로 바꾸고 싶다면??

그럴 때는 ..

std::regex rx(“([0-9]-[0-9].bmp)”);

이렇게 만들어 놓으면 $1, $2 이런식으로  ( 괄호로 묶은 패턴 갯수 만큼 1 에서 n개로 커져간다.. )
사용이 가능

즉..
std::string szReplacedData = std::regex_replace(szPrintData.c_str(), rx,  ” d:/$1″);
로 교체가 가능 함.

 

좋네.. 정규식.. 노가다가 줄었다..