C++ Chapter 18.5 : 정규 표현식 소개
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 18. 입력과 출력
정규 표현식 소개
#include <regex> C++ 11부터 사용 가능하다.
입력한 문자열이 이메일 주소 형식에 맞는지, 전화번호 형식에 맞는지, 우편번호 형식에 맞는지 등등 어떤 입력 문자열이 원하는 형식에 맞춰져 있는지를 검사할 수 있다.
🔔 regex
regex
인스턴스를 생성하여 생성자에 검사할 형식을 인수로 넘긴다.
- 예시
regex re("\\d")
re
는 십진수 숫자 하나d
를 입력받는 정규식 인스턴스가 된다.- 첫 번째
\
- 뒤에 있는
\
가 진짜\
역슬래시 라는 의미
- 뒤에 있는
\d
- digit 인가를 판별 (\n \t 같은 것)
"\\d"
는 정규식이 된다.- 참고 http://www.cplusplus.com/reference/regex/ECMAScript/
- std::regex_match(str, re)
- 검사할 형식으로 초기화한 regex 타입의 인스턴스인
re
과str
을 비교하여 올바른 형식인지 검사 후 true, false 를 리턴하는 함수이다. - 즉 정규식 패턴이 입력된 문자열
str
에 존재하는지 검사.
- 검사할 형식으로 초기화한 regex 타입의 인스턴스인
#include <iostream>
#include <regex> // ⭐⭐
using namespace std;
int main()
{
regex re("\\d");
string str;
while (true)
{
getline(cin, str);
if (std::regex_match(str, re))
cout << "Match" << endl;
else
cout << "No Match" << endl;
// 반복자를 이용하여 검사한 후 매치하는 부분만 출력
{
auto begin = std::srgex_iterator(str.begin(), str.end(), re);
auto end = std::srgex_iterator();
for (auto itr = begin; itr != end; ++itr)
{
std::smatch match = *itr;
cout << match.str() << " ";
}
cout << endl;
}
cout << endl;
}
return 0;
}
💎입력💎
0
123
01234
💎출력💎
Match
0
No Match
1 2 3
No Match
0 1 2 3 4
- 반복자를 이용하여 검사한 후 정규식과 입력한 문자열이 매치되는 부분만 출력
regex_iterator
클래스- 매치되는 항목에 대한 반복자 클래스
auto begin = std::srgex_iterator(str.begin(), str.end(), re)
str
의 첫 글자부터 마지막 글자까지의 범위 중에서- 정규식
re
와 매치 되는 첫 위치의 반복자를 리턴
auto end = std::srgex_iterator();
std::srgex_iterator()
- 이렇게 인수를 아무것도 넘기지 않으면 끝 반복자 위치 리턴.
end()
- 이렇게 인수를 아무것도 넘기지 않으면 끝 반복자 위치 리턴.
- for문
str
을 반복자 begin 부터 end까지 검사한다.std::smatch match = *itr;
- 한 글자
*itr
씩 정규식에 매칭되는지 검사 std::smatch
는 검색의 결과다. 정규식 검색 이후 결과 (매칭되는 글자)를match
에 저장
- 한 글자
match.str()
match
에 들어있는 문자열을 다 꺼내어 리턴- 한글자씩 정규식 검색 이후 결과를 리턴
- 입력 예시
- 현재 정규식
re
은\\d
로 십진수 1 개만 입력해야 한다. - 1️⃣ 0 입력시
regex_match
결과 true라서 “Match” 출력- for문 돌면서 한 글자씩 정규식에 부합하는 글자 출력 👉 0 출력
- 2️⃣ 123 입력
regex_match
결과 false라서 “No Match” 출력. (숫자가 여러개라 false)- for문 돌면서 한 글자씩 정규식에 부합하는 글자 출력 👉 1 2 3
- 한 글자씩 뜯어볼땐 부합하긴 한다… 숫자 1개
- 현재 정규식
🔔 정규식 형식
\\d
: 숫자 1개만 받아야 OK\\d+
: 숫자 1개 이상이면 OK\\d*
: 숫자 0개 이상이면 OK\\d?
: 숫자 0개 혹은 1개여야 OK
\d
와[:digit:]
는 같은 의미.\\d
는[[:digit:]]
와 같은 의미. 가장 바깥 대괄호는 안에 있는 것’만’ 괜찮다는 의미.[:digit:]
만 괜찮다 ! 숫자만 된다.regex regExp("[[:digit:]]{3}")
: 숫자 딱 3개만 입력받아야 OK- 0~9 숫자 중 딱 3개 입력 들어오면 OK
- 456 : OK 7894 : not OK
regex re("[ab]")
- a나 b만 된다. 각 1개씩만.
- a : OK
- b : OK
- ab : not OK
- c : not OK
- a나 b만 된다. 각 1개씩만.
regex re("[A-Z]+");
- ‘A’ 부터 ‘Z’ 까지의 문자가 1개 이상이면 OK
regex re("[A-Z]{1,5}");
- ‘A’ 부터 ‘Z’ 까지의 문자가 최소 1개 최대 5개면 OK
regex regExp(" ( [0-9] {1} ) ( [-]? ) ( [0-9] {1, 4} )");
- #-#### 형식
- 0 ~ 9 의 숫자는 반드시 1개만 있어야 하고
-
- 는 1개 있거나 없어야 하고
- 0~9 숫자는 최소 1개 최대 4개 있어야 한다.
- Match Ok 예시
- 3-789
- 78
- 78978
- 6-87
- Match not OK 예시
- 32-78
- 앞 숫자 반드시 1개 있어야 한다는거 초과
- 3-78948498
- 뒷 숫자 반드시 1~4개 있어야 한다는거 초과
- 3——-78
-
는 0개 or 1개 있어야 한다는거 위반
- 32-78
- 이메일 정규식
되게 복잡하던데 한번 다음에 구글링 해보자
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기