훈, IT 공부/C,C++,MFC

C++ PCRE 정규식 라이브러리 사용해서 정규표현식 사용하기

IT훈이 2020. 4. 8.
반응형

POSIX 정규표현식에서 확장된 Perl 방식의 PCRE . . . .  복잡한 설명은 제쳐두고

사용을 하긴 해야하는데 명확하게 사용하는 방법이 나와있는 것을 찾기가 어려워서 정리를 해보았습니다.

 

1. 검증을 받기위해서 정규식 데이터 세팅

	// 1. 검증을 받기위함 정규식 데이터 ( 주민등록번호)
	char *regex = "(?:[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[1,2][0-9]|3[0,1]))-[1-4][0-9]{6}";

검증을 받기위한 데이터를 변수에 넣어준다.

아래의 사이트를 통해서 원하는 정규식을 만들어 낼 수 있다.

https://regexr.com/

불러오는 중입니다...

2. 정규식 패턴을 가지고 컴파일을 진행

	// 2. 패턴 컴파일 (검출을 하기 위해서 패턴을 미리 컴파일해준다.)
	pcre *re = NULL;
	re = pcre_compile (regex,    /* the pattern */
		PCRE_CASELESS,			
		&szError,         		 /* for error message */
		&nErroroffset,  		 /* for error offset */
		0);            			 /* use default character tables */
	if (!re)
	{
		printf("pcre_compile failed (offset: %d), %s\n", nErroroffset, szError);
		return ;
	}

 PCRE_CAELESS 

 - 이 값은 패턴의 문자에서 대문자와 소문자를 구별하지 않겠다는 것

 

3. 정규식 검출 시작

	// 3. 정규식 검출 시작
	// 검출된 위치는 oVector에 인덱스로 저장됨, 0 1 한묶음 2 3 한묶음 이런식으로 됨
	while( ( nRet = pcre_exec(re, 0, strTextOutBuffer.c_str(), strTextOutBuffer.length(), nStartPos, 0, oVector, 3) ) > PCRE_ERROR_NOMATCH)
	{
		strMatch = strTextOutBuffer.substr(oVector[0], oVector[1] - oVector[0]);
		strMatch;
	    
		vector<int> vItemMaskPostList;
	
		for( int i = 8; i < 14; i++ )
		{
			vItemMaskPostList.push_back(i);
		}	
	}

 

 

전체소스

	#include "pcre.h"

	// 1. 검증을 받기위함 정규식 데이터 ( 주민등록번호)
	char *regex = "(?:[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[1,2][0-9]|3[0,1]))-[1-4][0-9]{6}";

	const char *szError;
	int nErroroffset = 0;

	// 2. 패턴 컴파일 (검출을 하기 위해서 패턴을 미리 컴파일해준다.)
	pcre *re = NULL;
	re = pcre_compile (regex,          /* the pattern */
		PCRE_CASELESS,			
		&szError,         /* for error message */
		&nErroroffset,     /* for error offset */
		0);             /* use default character tables */
	if (!re)
	{
		printf("pcre_compile failed (offset: %d), %s\n", nErroroffset, szError);
		return ;
	}

	string strTextOutBuffer = "711111-1111117 테스트 711111-1111117";	// 검증받을 대상 텍스트
	string strMatch;
	int nRet = -1;
	int nStartPos = 0;					// 검출을 시작할 위치
	int oVector[3];						// 정규식 결과를 담을 변수
	
	//신규 마스킹을 사용하기 위해서 
	string szMasking;
	
	int m_nMaskRightReplace = 8;	// 마스킹 시작점부터 마지막 지점까지의 길이
	int m_nMaskRightStart = 0;		// 마스킹 시작지점
	int nPcdLastStartPos = 0;		// 마지막에 시작한 시점의 위치
	
	// 3. 정규식 검출 시작
	// 검출된 위치는 oVector에 인덱스로 저장됨, 0 1 한묶음 2 3 한묶음 이런식으로 됨
	while( ( nRet = pcre_exec(re, 0, strTextOutBuffer.c_str(), strTextOutBuffer.length(), nStartPos, 0, oVector, 3) ) > PCRE_ERROR_NOMATCH)
	{
		strMatch = strTextOutBuffer.substr(oVector[0], oVector[1] - oVector[0]);
		strMatch;
	    
		vector<int> vItemMaskPostList;
	
		for( int i = 8; i < 14; i++ )
		{
			vItemMaskPostList.push_back(i);
		}	
	}

 

 

반응형

댓글