Programming/C

C++ 파일 내용 정규식 매칭

Tribal 2017. 9. 6. 00:52

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <fstream>
#include <regex>
 
#define BUF_SIZE 512
 
int main() {
    char fdata[BUF_SIZE];    
 
    ifstream ifs("./test.txt");
    
    if(ifs.is_open()) {                                            // 파일 열기 확인
        while (!ifs.eof()) {                                    // 파일 끝 확인
            memset(fdata, 0, BUF_SIZE);
            ifs.getline(fdata, BUF_SIZE);                        // 파일에서 1줄 읽어들임
 
            regex reg("^(\\w+?): (\\w+)");                        // 정규식 패턴
            string fdata_str = fdata;
            smatch m;
 
            bool ismatched = regex_search(fdata_str, m, reg);    // 정규식 패턴 매칭
 
            if (ismatched) {
                cout << m[1<< "+" << m[2<< endl;            // 매칭된 경우, 처리
            }
        }
 
        ifs.close();
    }
}
cs


코드 설명

  1. 10번째 줄에서 대상 파일을 지정하고, Open
  2. 12번째 줄에서 Open 여부 확인
  3. 13번째 줄에서 파일 끝(EoF,  End of File) 여부를 확인하여 4~7번 과정 반복
  4. 15번째 줄에서 한 줄씩 읽어들임
  5. 17번째 줄에서 정규식 패턴 생성
  6. 21번째 줄에서 정규식 패턴을 매칭하고 매칭 결과 반환
  7. 24번째 줄에서 매칭된 경우, 매칭된 문자열(m) 처리
  8. 28번째 줄에서 파일 Close

중점

  • 파일 전체에서 정규식 매칭을 하지 않고, 1줄씩 읽어들인 다음에 매칭을 확인
    (1줄이 아닌 전체를 매칭할 경우, 처음 한 번 매칭된 문자열을 찾으면 그대로 끝나기 때문)
  • smatch m 관련
    • Size : 괄호로 찾고자 하는 문자열의 수에 따라 m의 size가 달라짐( 확인 : m.size() )
    • m[0] : 매칭된 문자열 전체
    • m[1] : 매칭된 문자열 중 첫 번째 괄호에 해당하는 내용
    • m[2] : 매칭된 문자열 중 두 번째 괄호에 해당하는 내용
  • regex_search() 함수는 char, string, wchar 등 자료형에 따라 달라짐
    • 변수 m의 자료형도 여기에 따라 cmatch, smatch 등으로 달라짐

정규식 함수

  • regex_match() : 전체 문자열이 패턴에 매칭되는지
  • regex_search() : 문자열 중 일부가 패턴에 매칭되는지
  • regex_replace() : 매칭된 문자열을 교체
  • .....


Python 정규식이랑 달라서 조금 애먹었다... 익숙해지면 이것도 나쁘지 않을거 같다.