사용자 도구

사이트 도구


regexp:atl-정규표현식

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
regexp:atl-정규표현식 [2013/08/08 17:51] kieunsregexp:atl-정규표현식 [2024/04/23 22:43] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +~~Title: MS 정규식 (좀 다름)~~
 +
 +====== MS 의 정규식 ======
 +
 +Visual Studio에서 정규 표현식 지원 클래스 변경 ( 버젼별 변경 사항 : [[http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8379|누군가 정리함]] )
 +
 +  * ~ VS2005 : CAtlRegExp 를 사용합시다.
 +  * 2008 ~ : ATLServer 라이브러리가 제외 되었답니다.
 +    *  [[http://atlserver.codeplex.com/|ATLServer]] 에 공개 소스로 열렸답니다.
 +
 +  * 2008 ~ 이후 사용 가능한 것
 +    * std::regex
 +    * boost::basic_regex
 +====== regex_search ======
 +
 +===== 레퍼런스 =====
 +
 +  * [[http://msdn.microsoft.com/ko-kr/library/bb982334.aspx|MSDN regex_search Function]]
 +  * [[http://www.codeproject.com/Articles/26285/Quick-Start-for-C-TR1-Regular-Expressions|Quick Start for C++ TR1 Regular Expressions]]
 +
 +===== 사용 예 =====
 +
 +2008은 정식 지원 전이라서, **tr1** 네임스페이스를 붙여서 사용한다.
 +
 +<code>
 +// for 2008
 +std::tr1::cmatch _result;
 +
 +// for 2012
 +std::cmatch _result;
 +
 +// 2010 은 모르겠네, 안해봐서.
 +</code>
 +
 +사용 예제
 +
 +<code cpp>
 +#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;
 +}
 +</code>
 +
 +결과
 +
 +<code>
 +found string: thm":"http://abcde.xyz.xyz"
 +found string: thm":"http://abcde.xyz.xyz"
 +found string: http://abcde.xyz.xyz
 +</code>
 +
 +====== CAtlRegExp, CAtlREMatchContext ======
 +
 +  MSVS 2005까지만 사용 가능, 2008부터는 아래 클래스가 삭제됨
 +
 +CAtlRegExp, CAtlREMatchContext 를 사용하면 여러 개의 선택이 가능하다!
 +내가 정규 표현식이 익숙하지 않아서 그런지, 중간 결과를 패스 하는 것은 안되는 듯.
 +
 +===== 참고 링크 =====
 +
 +  * [[http://msdn.microsoft.com/en-us/library/k3zs4axe(v=vs.80).aspx|CAtlRegExp Class]]
 +  * [[http://msdn.microsoft.com/en-us/library/tx8hkhc6(v=vs.80).aspx|CAtlREMatchContext Class]]
 +  * 실습 가능한 사이트 : http://regexhero.net/tester/, 베리 굿!
 +  * 실습 가능한 예제 : http://www.codeproject.com/Articles/13320/Using-Regular-Expressions-in-MFC
 +  * [[http://msdn.microsoft.com/en-us/library/az24scfc(v=vs.71).aspx]] : microsoft reg exp 규칙
 +
 +===== 빠른 예제 =====
 +
 +<code cpp>
 +#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 );
 +}
 +
 +//...
 +
 +</code>
 +
 +아래와 같은 결과가 보인다.
 +
 +<code>
 +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
 +</code>
 +
 +
 +===== CAtlREMatchContext Class =====
 +
 +사용하는 예는 위의 예제를 참고하고,
 +
 +여러개의 결과를 찾았을때, 어떤 식으로 문자가 매치되는지 알아둘 필요가 있다.
 +
 +{{:regexp:catlrematchcontext-rule.gif|}}
 +====== MS 정규식의 검색 예제들 ======
 +
 +===== Ini 형식의 문자열 파싱 =====
 +
 +==== 섹션 ====
 +
 +<code>
 +1) 원본 
 +
 +[thisversion]
 +
 +2) 사용하는 정규식 - '[', ']' 사이의 글자를 모두 선택
 +
 +\[{.+}\]
 +
 +3) 결과는
 +
 +thisversion
 +
 +대괄호 사이의 문자열의 공백도 포함된다.
 +</code>
 +
 +==== 섹션 내용 ====
 +
 +원본 문자열
 +
 +<code>
 +; gameid =      " pr dfdfd dfdf" ;  dfdfdf
 +</code>
 +
 +4가지의 검색 결과가 필요
 +
 +  - 첫 주석만 분리, 주석이 없으면 빈공간으로. 주석 여부를 결정하기 위해서 무시하진 않는다.
 +  - gameid 부분 분리
 +  - " pr dfdfd dfdf" 분리, 좌우  스페이스 공간은 trim 한다.
 +  - 끝의 주석 무시
 +
 +사용된 검색식
 +
 +<code>
 +{[; \t]*}{\w+}\b*=+\b*({[^;]+}){[; \t]*}
 +or
 +// \w로만 파싱하면 _ 같은 기호가 있으면 불리해버리는 문제가 있어서
 +{[; \t]*}{\w+}\b*=\b*{[^;]+}{[; \t]*}
 +or
 +// 주석 다음 모든 글자들로 설정하는 방법으로 사용
 +{[; \t]*}{.+}\b*=\b*{[^;]+}{[; \t]*}
 +</code>
 +
 +결과, 따옴표 안에 있는 글자가 검색된 결과
 +
 +<code>
 +0 : '; '
 +1 : 'gameid'
 +2 : '" pr dfdfd dfdf" '
 +3 : ';  '
 +</code>
 +
 +====== 정규 표현식 검색 룰 ======
 +
 +정규표현식을 입력해서, 정규 검색시 사용한다. 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가 아닌 경우라는 뜻이 된다.                                                          |
 +
 +다음은 미리 정해진 특수기호들
 +
 +<code>
 +\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]+)
 +</code>
 +