정규 표현식은 문자열 처리를 위한 문법이다.
패턴에 따라 문자열을 검색하거나 교체할 수 있으므로 문자열을 효율적으로 처리할 수 있다.
c++에서 정규표현식을 사용하기 위해서는 헤더를 불러와서 사용해야 한다.
#include <regex>
표현식 | 방영일 |
---|---|
^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를 제외한 특수문자를 의미 |
(?:) | 캡쳐하지 않는 그룹 생성 |
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;
}
}
regex_search success : 1111 // 010-1111-2222
regex_search success : 1234 // 010-1234-5678
regex_match success : 1678 // 1678
regex_search success : 1678 // 1678
regex re에 정규 표현식을 넣어주었으며, 매칭된 문자열을 저장할 tmp를 선언 하였다.
regex_match와 regex_search를 사용하였는데
두 함수의 인자에는 검색할 문자열, 매칭된 내용을 저장할 smatch 변수, 정규표현식이 저장된 regex 순으로 넣어준다.
실행 결과 regex_match는 완벽하게 일치하는 매칭일때만 true를 반환하고 search는 부분적이여도 매칭을 해준다.
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;
}
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