C++ 정규표현식에서 { } 사용 시 주의할 점과 regex 예제
비주얼스튜디오 2005까지 표준 라이브러리로 포함되었던 atlrx.h는 2008부터 표준에서 제외되었습니다. 그리고 시간은 흘러 2018년이 되었는데요. 현재는 비주얼스튜디오 2017에서 C++ regex.h를 인클루드하여 정규표현식(regular expression, 이하 regex)을 사용할 수 있습니다.
[regular expression 프로그래밍 문법과 사용법]
정규표현식 자체는 변할 것이 없으므로 VisualStudio 2005나 2017이나 차이가 없습니다. 다만 소스 코드에서 표현할 땐 괄호에서 차이가 발생하는데요.
아래처럼 { } 괄호 한 쌍 사용이 달라졌습니다.
VS 2005 regex
1 | {[\d]} | cs |
VS 2017 regex
1 | [\d] | cs |
[\d] 의미 = [ ] 사이의 숫자와의 매칭
정규표현식을 감싸는 { } 기호 한 쌍이 VisualStudio 2017에선 생략됩니다. (2005 이상에서 생략) 그래서 2005에서 사용하던 C++ 정규표현식은 2017에서 사용할 때 { } 괄호 한 쌍을 제거해야 합니다.
또한, 최신툴로 업그레이드 못 하는 상황에서 atlrx.h 참조 추가 오류가 발생할 수 있습니다. 그럴 땐 아래 사이트 ATL Server에서 관련 파일을 다운로드하여 사용하시면 됩니다.
비주얼스튜디오 2017을 사용하신다면, 추가로 설치할 라이브러리는 없습니다.
VisualStudio 2005 이하 사용하다가 버전을 올리실 경우 위와 같은 { } 괄호 주의점 꼭 기억하세요.
[regular expression 프로그래밍 문법과 사용법] Matching URL 예제
추가로 비주얼스튜디오 2017 C++에서 사용할 수 있는 정규표현식 regex 예제 1개 소개하며 글을 마칩니다.
정규표현식 예제
- 정규표현식에 일치하는지 확인하기
- 문자열에서 모든 숫자 찾기
☞ 예제 소스 (출처 : 초보자를 위한 C++ 200제 [링크])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <iostream> #include <regex> #include <string> using namespace std; int main() { regex re1(R"(\d+)"); string str1("1234"); bool is_match = regex_match(str1, re1); cout << boolalpha; cout << "is_match = " << is_match << endl; regex re2(R"(\d+)"); string str2 = "ab 123456 cd ef"; smatch match_info; regex_search(str2, match_info, re2); cout << "number : " << match_info.str() << endl; return 0; } | cs |
[예제 문법 실행 결과]
regex 예제에서 사용한 메타 문자
\d |
검색 조건은 숫자로 합니다. |
+ |
앞의 조건을 1번 또는 여러 번 반복합니다. |
C++ regex 클래스 객체 생성자엔 ( ) 괄호와 R을 붙여 정규표현식 문법임을 명시합니다. 또한, smatch 클래스엔 정규표현식 수행 결과가 저장됩니다.
위 예제를 수행하면 str1 문자열이 re1에 정의된 표현식과 같다는 결과를 알려주고요. re2를 통해 str2에 있는 모든 숫자가 추출됩니다.
위 예제에서도 확인되듯이, regex 클래스가 지원되며 프로그래머에게 장점이 많아졌습니다. 무엇보다 윈도우 환경에서 정규표현식 소스 코드 구현량이 현격히 줄어들었어요.
[regular expression 프로그래밍 문법과 사용법]
덧글 1. 위 예제는 초보자를 위한 C++ 200제를 인용했습니다.
덧글 2. 정규표현식을 검사할 수 있는 사이트는 RegExr을 추천합니다.
C++ 정규표현식에서 { } 사용 시 주의할 점과 regex 예제