regexp:atl-정규표현식
목차
~~Title: MS 정규식 (좀 다름)~~
MS 의 정규식
Visual Studio에서 정규 표현식 지원 클래스 변경 ( 버젼별 변경 사항 : 누군가 정리함 )
- ~ VS2005 : CAtlRegExp 를 사용합시다.
- 2008 ~ : ATLServer 라이브러리가 제외 되었답니다.
- ATLServer 에 공개 소스로 열렸답니다.
- 2008 ~ 이후 사용 가능한 것
- std::regex
- boost::basic_regex
regex_search
레퍼런스
사용 예
2008은 정식 지원 전이라서, tr1 네임스페이스를 붙여서 사용한다.
// for 2008 std::tr1::cmatch _result; // for 2012 std::cmatch _result; // 2010 은 모르겠네, 안해봐서.
사용 예제
#include <iostream> #include <regex> int _tmain(int argc, _TCHAR* argv[]) { const char* _sampleStr = "{\"pho\":\"http://1.2.3.4\", \"thm\":\"http://abcde.xyz.xyz\"}"; // // 얻고 싶은 것은, // http://abcde.xyz.xyz\ 까지만 // std::string _photoUrl(_sampleStr); std::cmatch _reg_result; // // 서브 그룹만 얻어다 쓰자. 그룹이 설정 되어 있으니 검색 결과는 1개 이상이 나온다. // 가장 마지막 검색 결과가 찾는 결과임. // std::regex _reg_exp("thm\":\"(.+)\""); if(std::regex_search(_sampleStr, _reg_result, _reg_exp)) { if(_reg_result.size() != 0 ) { std::cout << "found string: " << _reg_result[0] << std::endl; } //확인용이니까 전부 찍어본다. for( int i = 0; i < _reg_result.size(); ++ i ) { std::cout << "found string: " << _reg_result[i] << std::endl; } } return 0; }
결과
found string: thm":"http://abcde.xyz.xyz" found string: thm":"http://abcde.xyz.xyz" found string: http://abcde.xyz.xyz
CAtlRegExp, CAtlREMatchContext
MSVS 2005까지만 사용 가능, 2008부터는 아래 클래스가 삭제됨
CAtlRegExp, CAtlREMatchContext 를 사용하면 여러 개의 선택이 가능하다! 내가 정규 표현식이 익숙하지 않아서 그런지, 중간 결과를 패스 하는 것은 안되는 듯.
참고 링크
- 실습 가능한 사이트 : http://regexhero.net/tester/, 베리 굿!
- http://msdn.microsoft.com/en-us/library/az24scfc(v=vs.71).aspx : microsoft reg exp 규칙
빠른 예제
#include <atlbase.h> #include <atlcoll.h> #include <atlfile.h> #include <atlrx.h> #include <tchar.h> //... CAtlRegExp<> _regExp; REParseError _status = _regExp.Parse( <"정규표현식"> ); if( _status != REPARSE_ERROR_OK ) return; CAtlREMatchContext<> _matchRet; if( !_regExp.Match( <"검사할텍스트">, &_matchRet ) ) return; for( UINT nGroupIndex = 0; nGroupIndex < _matchRet.m_uNumGroups; ++nGroupIndex ) { const CAtlREMatchContext<>::RECHAR* szStart = 0; const CAtlREMatchContext<>::RECHAR* szEnd = 0; _matchRet.GetMatch( nGroupIndex, &szStart, &szEnd ); ptrdiff_t nLength = szEnd - szStart; TCHAR _tmstr[ MAX_PATH ]; wcsncpy_s( _tmstr, szStart, nLength ); // 결과를 차례대로 출력 CString _finalMsg; _finalMsg.Format( _T("%d : '%s'"), nGroupIndex, _tmstr ); writeLog( mEditResult, _finalMsg ); } //...
아래와 같은 결과가 보인다.
1) 입력값 # 127.0.0.1 gi.arario.jp 2) 정규표현식 ({[# \t]*})?({[^ \t]+})?{[ \t]+}?({[^ \t]+}) 3) 결과 0 : # 1 : 127.0.0.1 2 : 3 : gi.arario.jp
CAtlREMatchContext Class
MS 정규식의 검색 예제들
Ini 형식의 문자열 파싱
섹션
1) 원본 [thisversion] 2) 사용하는 정규식 - '[', ']' 사이의 글자를 모두 선택 \[{.+}\] 3) 결과는 thisversion 대괄호 사이의 문자열의 공백도 포함된다.
섹션 내용
원본 문자열
; gameid = " pr dfdfd dfdf" ; dfdfdf
4가지의 검색 결과가 필요
- 첫 주석만 분리, 주석이 없으면 빈공간으로. 주석 여부를 결정하기 위해서 무시하진 않는다.
- gameid 부분 분리
- “ pr dfdfd dfdf” 분리, 좌우 스페이스 공간은 trim 한다.
- 끝의 주석 무시
사용된 검색식
{[; \t]*}{\w+}\b*=+\b*({[^;]+}){[; \t]*} or // \w로만 파싱하면 _ 같은 기호가 있으면 불리해버리는 문제가 있어서 {[; \t]*}{\w+}\b*=\b*{[^;]+}{[; \t]*} or // 주석 다음 모든 글자들로 설정하는 방법으로 사용 {[; \t]*}{.+}\b*=\b*{[^;]+}{[; \t]*}
결과, 따옴표 안에 있는 글자가 검색된 결과
0 : '; ' 1 : 'gameid' 2 : '" pr dfdfd dfdf" ' 3 : '; '
정규 표현식 검색 룰
정규표현식을 입력해서, 정규 검색시 사용한다. gnu 계열과 좀 다른데…
사용법은,
- Parse()에 정규 표현식 스트링을 파라미터로 넘기면 된다.
- Match() 함수로 정규 표현을 검색한다.
- 검색은 1개 이상을 찾을 수 있다
정규 표현식
. | 아무 한 문자 일치. ex : %RegExp%. |
[ ] | 대괄호 안의 글자 그룹과 일치하는 경우, [abc] 면 a, b, c 중에 일치 되는 경우를 뜻한다. |
[^] | [] 괄호 안에서 사용되면 괄호 안의 문자를 제외한 일치 사항에 대해서 선택한다. [^abc]이면 a,b,c는 제외한 나머지글자가 선택된다. |
^ | 줄의 시작 부분에서 ^ 다음 부분의 일치 사항을 선택. ex : ^%RegExp% |
- | '-' 전후로 전부터 후까지 해당되는 글자가 포함되는 경우 [0-9] 는 0부터 9까지의 숫자면 매치 된다는 의미 |
? | 0개 또는 1개 일치 되는 경우 [0-9][0-9]? 는 “2” 나 “12” 모두 일치된다. |
+ | 1개 이상 일치 되는 경우 ex : [0-9]+ 는 1, 123, 2323213 모두 해당된다. |
* | 0개 이상 일치되는 경우 |
??, +?, *? | 깔끔하게 안되는데?? 한번만 일치되도록 한다라는 것 같은데?? |
Non-greedy versions of ?, +, and *. These match as little as possible, unlike the greedy versions that match as much as possible | |
(for example, given the input “<abc><def>”, <.*?> matches “<abc>” while <.*> matches “<abc><def>”) | |
( ) | 괄호 안의 내용을 그룹화 한다. (우선순위를 가지고 먼저 처리한다.) ex : (\d+,)*\d+ 는 콤마로 구분되는 숫자를 선택한다. (for example, “1” or “1,23,456”) |
{ } | 매치되는 그룹을 규정한다. CAtlREMatchContext 클래스를 사용해서 중괄호 그룹된 것들을 순서대로 얻어갈 수 있다. |
\ | 특수문자를 처리한다. |
용도1) 미리 정의된 그룹을 가리키는 기호. \a 모든 알파벳 글자를 가리키는 특수기호 |
|
용도2) 정규식의 표현식 기호 자체를 문자로 사용하고 싶을때 [0-9]+ 는 모든 숫자와 매치, [0-9]\+ 는 숫자 다음에 있어야 할 '+' 문자로 인식. |
|
용도3) \ 다음에 숫자가 오는 경우 {}로 그룹핑된 검색식을 재사용할때. 각 검색식의 인덱스는 0부터 시작., |
|
<{.*?}>.*?</\0> matches “<head>Contents</head> –> \0는 첫번째 {} 그룹을 가리킨다. | |
$ | 줄의 끝부분에서부터 일치하는 경우 [0-9]$ 는 줄 끝에 숫자가 있는 경우가 된다. |
| | or를 가리킨다. | 좌우 모두 해당되는 경우가 된다. T|the는 The 나 the 모두 가리킨다. |
! | 부정식이다. '!' 다음의 글자가 아닌 경우를 가리킨다. a!b 는 a 다음에 b가 아닌 경우라는 뜻이 된다. |
다음은 미리 정해진 특수기호들
\a - 모든 영숫자. ([a-zA-Z0-9]) \b - 공백이나 탭류 ([ \\t]) \c - 알파벳 한글자 ([a-zA-Z]) \d - 10진수 숫자 ([0-9]) \h - 16진수 숫자 ([0-9a-fA-F]) \n - 라인표시 (\r|(\r?\n)) \q - 따옴표 안의 스트링, 표기 양식 위키에 삽입 불가 [[http://msdn.microsoft.com/en-us/library/k3zs4axe(v=vs.80).aspx|참고]] \w - 한 단어 ([a-zA-Z]+) \z - 숫자 ([0-9]+)
regexp/atl-정규표현식.txt · 마지막으로 수정됨: 2024/04/23 22:43 저자 127.0.0.1