regexp:atl-정규표현식
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
regexp:atl-정규표현식 [2013/08/08 18:54] – [MS 의 정규식] kieuns | regexp:atl-정규표현식 [2024/04/23 22:43] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ~~Title: MS 정규식 (좀 다름)~~ | ||
+ | |||
+ | ====== MS 의 정규식 ====== | ||
+ | |||
+ | Visual Studio에서 정규 표현식 지원 클래스 변경 ( 버젼별 변경 사항 : [[http:// | ||
+ | |||
+ | * ~ VS2005 : CAtlRegExp 를 사용합시다. | ||
+ | * 2008 ~ : ATLServer 라이브러리가 제외 되었답니다. | ||
+ | * [[http:// | ||
+ | |||
+ | * 2008 ~ 이후 사용 가능한 것 | ||
+ | * std::regex | ||
+ | * boost:: | ||
+ | ====== regex_search ====== | ||
+ | |||
+ | ===== 레퍼런스 ===== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ===== 사용 예 ===== | ||
+ | |||
+ | 2008은 정식 지원 전이라서, | ||
+ | |||
+ | < | ||
+ | // for 2008 | ||
+ | std:: | ||
+ | |||
+ | // for 2012 | ||
+ | std::cmatch _result; | ||
+ | |||
+ | // 2010 은 모르겠네, | ||
+ | </ | ||
+ | |||
+ | 사용 예제 | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int _tmain(int argc, _TCHAR* argv[]) | ||
+ | { | ||
+ | const char* _sampleStr = | ||
+ | " | ||
+ | |||
+ | // | ||
+ | // 얻고 싶은 것은, | ||
+ | // http:// | ||
+ | // | ||
+ | std::string _photoUrl(_sampleStr); | ||
+ | std::cmatch _reg_result; | ||
+ | // | ||
+ | // 서브 그룹만 얻어다 쓰자. 그룹이 설정 되어 있으니 검색 결과는 1개 이상이 나온다. | ||
+ | // 가장 마지막 검색 결과가 찾는 결과임. | ||
+ | // | ||
+ | std:: | ||
+ | if(std:: | ||
+ | { | ||
+ | if(_reg_result.size() != 0 ) | ||
+ | { | ||
+ | std::cout << "found string: " << _reg_result[0] << std::endl; | ||
+ | } | ||
+ | | ||
+ | // | ||
+ | for( int i = 0; i < _reg_result.size(); | ||
+ | { | ||
+ | std::cout << "found string: " << _reg_result[i] << std::endl; | ||
+ | } | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 결과 | ||
+ | |||
+ | < | ||
+ | found string: thm":" | ||
+ | found string: thm":" | ||
+ | found string: http:// | ||
+ | </ | ||
+ | |||
+ | ====== CAtlRegExp, CAtlREMatchContext ====== | ||
+ | |||
+ | MSVS 2005까지만 사용 가능, 2008부터는 아래 클래스가 삭제됨 | ||
+ | |||
+ | CAtlRegExp, CAtlREMatchContext 를 사용하면 여러 개의 선택이 가능하다! | ||
+ | 내가 정규 표현식이 익숙하지 않아서 그런지, 중간 결과를 패스 하는 것은 안되는 듯. | ||
+ | |||
+ | ===== 참고 링크 ===== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * 실습 가능한 사이트 : http:// | ||
+ | * 실습 가능한 예제 : http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ===== 빠른 예제 ===== | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | //... | ||
+ | |||
+ | CAtlRegExp<> | ||
+ | REParseError _status = _regExp.Parse( <" | ||
+ | if( _status != REPARSE_ERROR_OK ) return; | ||
+ | |||
+ | CAtlREMatchContext<> | ||
+ | if( !_regExp.Match( <" | ||
+ | |||
+ | for( UINT nGroupIndex = 0; nGroupIndex < _matchRet.m_uNumGroups; | ||
+ | { | ||
+ | const CAtlREMatchContext<>:: | ||
+ | const CAtlREMatchContext<>:: | ||
+ | _matchRet.GetMatch( nGroupIndex, | ||
+ | |||
+ | ptrdiff_t nLength = szEnd - szStart; | ||
+ | |||
+ | TCHAR _tmstr[ MAX_PATH ]; | ||
+ | wcsncpy_s( _tmstr, szStart, nLength ); | ||
+ | |||
+ | // 결과를 차례대로 출력 | ||
+ | CString _finalMsg; | ||
+ | _finalMsg.Format( _T("%d : ' | ||
+ | writeLog( mEditResult, | ||
+ | } | ||
+ | |||
+ | //... | ||
+ | |||
+ | </ | ||
+ | |||
+ | 아래와 같은 결과가 보인다. | ||
+ | |||
+ | < | ||
+ | 1) 입력값 | ||
+ | |||
+ | # 127.0.0.1 | ||
+ | |||
+ | 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 = | ||
+ | </ | ||
+ | |||
+ | 4가지의 검색 결과가 필요 | ||
+ | |||
+ | - 첫 주석만 분리, 주석이 없으면 빈공간으로. 주석 여부를 결정하기 위해서 무시하진 않는다. | ||
+ | - gameid 부분 분리 | ||
+ | - " pr dfdfd dfdf" 분리, 좌우 | ||
+ | - 끝의 주석 무시 | ||
+ | |||
+ | 사용된 검색식 | ||
+ | |||
+ | < | ||
+ | {[; \t]*}{\w+}\b*=+\b*({[^; | ||
+ | or | ||
+ | // \w로만 파싱하면 _ 같은 기호가 있으면 불리해버리는 문제가 있어서 | ||
+ | {[; \t]*}{\w+}\b*=\b*{[^; | ||
+ | or | ||
+ | // 주석 다음 모든 글자들로 설정하는 방법으로 사용 | ||
+ | {[; \t]*}{.+}\b*=\b*{[^; | ||
+ | </ | ||
+ | |||
+ | 결과, 따옴표 안에 있는 글자가 검색된 결과 | ||
+ | |||
+ | < | ||
+ | 0 : '; | ||
+ | 1 : ' | ||
+ | 2 : '" | ||
+ | 3 : '; | ||
+ | </ | ||
+ | |||
+ | ====== 정규 표현식 검색 룰 ====== | ||
+ | |||
+ | 정규표현식을 입력해서, | ||
+ | |||
+ | 사용법은, | ||
+ | - Parse()에 정규 표현식 스트링을 파라미터로 넘기면 된다. | ||
+ | - Match() 함수로 정규 표현을 검색한다. | ||
+ | - **검색은 1개 이상을 찾을 수 있다** | ||
+ | |||
+ | ===== 정규 표현식 ===== | ||
+ | |||
+ | | . | 아무 한 문자 일치.\\ ex : %RegExp%. | ||
+ | | [ ] | 대괄호 안의 글자 그룹과 일치하는 경우, [abc] 면 a, b, c 중에 일치 되는 경우를 뜻한다. | ||
+ | | | ||
+ | | %%^%% | %%줄의 시작 부분에서 ^ 다음 부분의 일치 사항을 선택.%%\\ %%ex : ^%RegExp%%% | ||
+ | | - | ' | ||
+ | | ? | 0개 또는 1개 일치 되는 경우\\ [0-9][0-9]? 는 " | ||
+ | | + | 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 "< | ||
+ | | %%( )%% | 괄호 안의 내용을 그룹화 한다. (우선순위를 가지고 먼저 처리한다.)\\ ex : %%(\d+, | ||
+ | | %%{ }%% | 매치되는 그룹을 규정한다. CAtlREMatchContext 클래스를 사용해서 중괄호 그룹된 것들을 순서대로 얻어갈 수 있다. | ||
+ | | %%\%% | 특수문자를 처리한다. | ||
+ | | ::: | 용도1)\\ 미리 정의된 그룹을 가리키는 기호. %%\a%% 모든 알파벳 글자를 가리키는 특수기호 | ||
+ | | ::: | 용도2) 정규식의 표현식 기호 자체를 문자로 사용하고 싶을때\\ [0-9]+ 는 모든 숫자와 매치, [0-9]\+ 는 숫자 다음에 있어야 할 ' | ||
+ | | ::: | 용도3) %%\%% 다음에 숫자가 오는 경우\\ {}로 그룹핑된 검색식을 재사용할때. 각 검색식의 인덱스는 0부터 시작., | ||
+ | | ::: | < | ||
+ | | $ | 줄의 끝부분에서부터 일치하는 경우\\ [0-9]$ 는 줄 끝에 숫자가 있는 경우가 된다. | ||
+ | | %%|%% | or를 가리킨다. %%|%% 좌우 모두 해당되는 경우가 된다.\\ %%T|the%%는 The 나 the 모두 가리킨다. | ||
+ | | ! | 부정식이다. ' | ||
+ | |||
+ | 다음은 미리 정해진 특수기호들 | ||
+ | |||
+ | < | ||
+ | \a | ||
+ | - 모든 영숫자. ([a-zA-Z0-9]) | ||
+ | \b | ||
+ | - 공백이나 탭류 ([ \\t]) | ||
+ | \c | ||
+ | - 알파벳 한글자 ([a-zA-Z]) | ||
+ | \d | ||
+ | - 10진수 숫자 ([0-9]) | ||
+ | \h | ||
+ | - 16진수 숫자 ([0-9a-fA-F]) | ||
+ | \n | ||
+ | - 라인표시 (\r|(\r? | ||
+ | \q | ||
+ | - 따옴표 안의 스트링, 표기 양식 위키에 삽입 불가 [[http:// | ||
+ | \w | ||
+ | - 한 단어 ([a-zA-Z]+) | ||
+ | \z | ||
+ | - 숫자 ([0-9]+) | ||
+ | </ | ||
+ | |||