regex in C++

jathazp·2022년 9월 2일
0

1. 정규 표현식

정규 표현식은 문자열 처리를 위한 문법이다.
패턴에 따라 문자열을 검색하거나 교체할 수 있으므로 문자열을 효율적으로 처리할 수 있다.

2. 사용법 ( C++ )

c++에서 정규표현식을 사용하기 위해서는 헤더를 불러와서 사용해야 한다.

#include <regex>

2-1. 정규식의 기본 문법

표현식방영일
^x'^'은 문자열의 시작을 표현하며, x문자로 시작됨을 의미
x$'$'은 문자열의 종료를 표현하며, x문자로 종료됨을 의미
.x'.'은 개행문자 \n을 제외한 다른 모든 문자를 의미
x+'+'은 1회 이상 반복을 의미, x문자가 1번 이상 반복됨을 의미 ({1,}과 동일)
x*'*'은 0회 이상 반복을 의미, x문자가 0번 이상 반복됨을 의미 ({0,}과 동일)
x?'?'은 0 or 1개 문자 매칭 의미, x문자가 존재할 수도 있고 안할수도 있다는 의미 ({0,1}과 동일)
x|y'|'은 or를 표현, x 또는 y가 나온다는 의미
(x)'()'은 그룹을 표현, 괄호로 묶인 패턴을 의미 ((abc){3}와 같이 사용해서 abcabcabc를 검출하는데 쓰임)
x{n}'{}'은 반복을 의미, x가 n번 반복됨을 의미
x{n,}'{,}'은 반복을 의미, x가 n번 이상 반복됨을 의미
x{n,m}'{}'은 반복을 의미, x가 n번 이상 m번 이하로 반복됨을 의미
[xy]'[]'은 x또는 y를 찾는다는 의미, [a-z0-9]이면 알파벳 소문자 또는 숫자를 찾는다는 의미
[^xy]'[^]'은 not을 의미, x 및 y 를 제외하고 찾는다는 의미
[a-z]'[-]'은 a ~ z 를 찾는다는 의미
\d'\d'은 digit으로 숫자를 의미
\D'\D'은 not digit으로 숫자를 제외하고 나머지 다른 문자를 의미
\s'\s'은 space로 공백문자를 의미
\S'\S'은 not space로 공백문자를 제외한 나머지 다른 문자를 의미
\t'\t'은 tap을 의미
\w'\w'은 알파벳 대문자,소문자와 숫자를 의미, [A-Za-z0-9]을 의미
\W'\W'은 not \w, 즉 \w를 제외한 특수문자를 의미
(?:)캡쳐하지 않는 그룹 생성

3. 예제

string str[2] = [ '010-1111-2222', '02-333-7777' ]
	string str[4] = { "010-1111-2222", "010-333-7777","010-1234-5678","1678"};
	for (auto i : str) {
		regex re("1\\d\\d\\d");
		smatch tmp;
		if (regex_match(i, tmp, re)) {
			cout << "regex_match success : " << tmp[0].str() << endl;
		}

		if (regex_search(i, tmp, re)) {
			cout << "regex_search success : " << tmp[0].str() << endl;
		}
	}

3-1. 결과

regex_search success : 1111 // 010-1111-2222
regex_search success : 1234 // 010-1234-5678
regex_match success : 1678 // 1678
regex_search success : 1678 // 1678
  1. regex re에 정규 표현식을 넣어주었으며, 매칭된 문자열을 저장할 tmp를 선언 하였다.

  2. regex_match와 regex_search를 사용하였는데
    두 함수의 인자에는 검색할 문자열, 매칭된 내용을 저장할 smatch 변수, 정규표현식이 저장된 regex 순으로 넣어준다.

  3. 실행 결과 regex_match는 완벽하게 일치하는 매칭일때만 true를 반환하고 search는 부분적이여도 매칭을 해준다.

  4. regex_search에서 문자열을 string으로 넘길건지 char * 형으로 넘길건지 에 따라 cmatch인지 smatch인지 차이가 있다.

		regex re("1\\d\\d\\d");
		cmatch tmp;
		char str[14] = "010-1111-2222";
		if (regex_match(str, tmp, re)) {
			cout << "regex_match success : " << tmp[0].str() << endl;
		}
		regex re("1\\d\\d\\d");
		smatch tmp;
		string str = "010-1111-2222";
		if (regex_match(str, tmp, re)) {
			cout << "regex_match success : " << tmp[0].str() << endl;
		}

regex in javascript

https://beomy.tistory.com/21
https://wormwlrm.github.io/2020/07/19/Regular-Expressions-Tutorial.html

match vs exec
https://blog.naver.com/PostView.nhn?blogId=keiaz&logNo=220915832892

0개의 댓글