CAtlRegExp : 정규 표현식

CAtlRegExp을 이용하여 정규 표현식 (Regular expression)을 처리해 보자. 여기서는 숫자와 소숫점의 숫자에 대해서 처리해본다.

정규 표현식에 대한 상세한 설명은 책을 보던가 아래 두 사이트를 참고 한다.

http://blog.naver.com/knight50/80128661197

http://www.welog.net/gbbs/bbs/board.php?bo_table=zetc&wr_id=50

CAtlRegExp는 완전하게 표준을 따르지 않기 때문에 일부 표현식을 처리하지 못한다.
이부분에 대해서는 아래 링크를 참조한다.

http://www.44342.com/VC-f953-t7278-p1.htm

   엌 비 표준 !!!

대표적인 것 하나를 예를 들자면  "^[0-9]{2}$" 식의 경우 두자리 숫자를 표현하는 식이지만 CAtlRegExp에서는  반복 지시자 { }를 인식하지 못하기 때문에 "^[0-9][0-9]$"와 같이 정상적으로 파싱 한다. 이 외에도 다른 비표준에 대한 사항은 위 링크를 참조한다.

< 정규식의 문법 요약 > 이외에도 많지만 생략한다.

^ : 정규식의 시작

$ : 정규식의 끝

[ ] :  대괄호에 나열한 문자중에 하나를 나타낸다.
       예) [abc] a, b, c 문자중에 하나를 나타낸다.

대괄호속의 하이픈 [ - ] : 범위를 나타낸다.
       예) [a-c] a, b, c중 한문자를 나타낸다.

숫자 표기 \d : [0-9]와 같은 의미로 C++에서 사용할려면 "\\d"로 표기한다.
        예) "^\\d$"  한자리 숫자를 입력 받는다.

1회 이상 반복자 + :  플러스( + )가 붙으면 1회 이상 반복됨을 나타낸다.
        예) "^\\d+$" 한자리 이상의 양의 정수를 입력 받는다.

반복수 정하기 { } : CAtlRegExp는 표준을 준수 하지 않기 때문에 지원되지 않는 표현법이다.
        예) "^\\d{2}$" 두자리 양의 정수를 입력 받는다.
        대체 방법 :  "^\\d\\d$"

< 예제 >

#include "stdafx.h"

#include <windows.h>

#include <atlrx.h>

 

int _tmain(int argc, _TCHAR* argv[])

{

    char* szStr1 = "12";

    char* szStr2 = "3.21";

 

    CAtlRegExp<> re;

    CAtlREMatchContext<> mc;

 

    //양의 정수 체크

    if (re.Parse(_T( "^\\d+$" )) != REPARSE_ERROR_OK)

        return 1;

    if (!re.Match( szStr1, &mc) )

        return 1;

 

    //두자리의 수인지 검사

    if (re.Parse(_T( "^\\d\\d$" )) != REPARSE_ERROR_OK)

        return 1;

    if (!re.Match( szStr1, &mc) )

        return 1;

 

    //소수점 위로 한자리 소수점 아래로 두자리

    if (re.Parse(_T( "^\\d.\\d\\d$" )) != REPARSE_ERROR_OK)

        return 1;

    if (!re.Match( szStr2, &mc) )

        return 1;

    return 0;

}

Parse()로 정규 표현식이 바른 표현법을 나타내는지 검사후 Match()로 파싱한다.

프로젝트 :  catlregexp.zip