티스토리 뷰
소스코드
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 |
코드 설명
- 10번째 줄에서 대상 파일을 지정하고, Open
- 12번째 줄에서 Open 여부 확인
- 13번째 줄에서 파일 끝(EoF, End of File) 여부를 확인하여 4~7번 과정 반복
- 15번째 줄에서 한 줄씩 읽어들임
- 17번째 줄에서 정규식 패턴 생성
- 21번째 줄에서 정규식 패턴을 매칭하고 매칭 결과 반환
- 24번째 줄에서 매칭된 경우, 매칭된 문자열(m) 처리
- 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 정규식이랑 달라서 조금 애먹었다... 익숙해지면 이것도 나쁘지 않을거 같다.
'Programming > C' 카테고리의 다른 글
C++ virtual과 &(참조 포인터) 관련 삽질방지 (1) | 2018.02.28 |
---|---|
소프트웨어 디자인 패턴 (0) | 2018.01.27 |
C++ 깔끔한 패턴 및 코딩 연습 백업 (0) | 2017.08.30 |
Linux gcc Compile MakeFile (0) | 2016.11.20 |
List Control 사용하기 (0) | 2016.11.07 |
댓글