코딩테스트를 푸는데, 다른 사람의 풀이 중 regex를 사용한 풀이가 있길래 정리해보았다.
'정규표현식'이란, 문자들의 규칙(패턴)을 정의하는 특수한 문자열이다.
regex = regular expression
| 기호 / 표현 | 의미 및 설명 |
|---|---|
. | 임의의 한 문자 (줄바꿈 제외) |
* | 앞 문자가 0번 이상 반복됨 |
+ | 앞 문자가 1번 이상 반복됨 |
? | 앞 문자가 0번 또는 1번 나타남 |
\d | 숫자 (0~9) |
\w | 단어 문자 (영문자, 숫자, 밑줄 _) |
\s | 공백 문자 (스페이스, 탭, 개행 등) |
\b | 단어 경계 (단어의 시작 또는 끝) |
[abc] | a, b, c 중 하나와 일치 |
[^abc] | a, b, c 이외의 문자와 일치 |
^ | 문자열의 시작 |
$ | 문자열의 끝 |
regex_match() : 전체 문자열을 매칭을 통해 정확히 일치하는 지 검사
regex_search() : 문자열 검색을 통해 일부분 검사
regex_replace() : 다른 문자열로 치환
return bool = regex_match(원본 문자열, 정규표현식);
전체 문자열이 정규식과 정확히 일치하는 지 검사하고 일치한다면 true 를 반환한다.
regex pattern("[a-z]+\d+")
[a-z]+
소문자 하나 이상 반복 (+를 추가했기 때문. 기본값은 [a-z])
\d+
숫자 하나 이상 반복 (+를 추가했기 때문. 기본값은 \d)
C++에서 문자열 리터럴 "..." 안에 \를 쓰려면, 이스케이프 문자로 인식되지 않게 \ 두 번 써야 한다.
➡ regex 변수 내부에 들어가는 값은 문자열이기 때문에 숫자인 \d를 넣을 때도 \\d로 작성해야한다.
#include <iostream>
#include <regex>
using namespace std;
int main()
{
string s = "abc123";
regex pattern("[a-z]+\\d+");
if (regex_match(s, pattern)) // 문자열 s의 정규표현식이 일치한다면
{
cout << "전체 일치!"; // 소문자와 숫자로 구성된 문자열인것
}
}
return bool = regex_search(원본 문자열, 정규표현식);
문자열의 일부분이라도 정규식에 일치하는 부분이 있다면 true 를 반환한다.
string s = "abc123xyz";
regex pattern("\\d+");
if (regex_search(s, pattern))
{
cout << "숫자 존재!";
}
regex_replace(원본 문자열, 정규표현식, 치환할 문자열);
[aeiou] : a, e, i, o, u 중 어떤 문자라도 일치하는지
+ = 앞에 있는 문자 클래스가 1번 이상 반복될 수 있다는 의미.
➡ 즉, [aeiou]+로 사용할 경우, 연속된 모음이 한번에 처리된다.
[aeiou]로 사용하여 치환했을 경우,
'i', 'e', 'o', 'e', 'e', 'o', 'u' ➡ 내부적으로 총 7번의 매치가 일어나고 각각 제거된다.
[aeiou]+로 사용하여 치환했을 경우,
"ieoeeou" 전체를 한 번에 매치한다. (총 1번의 매치)
#include <string>
#include <vector>
#include <regex>
using namespace std;
string solution(string my_string)
{
string answer = "";
regex pattern("[aeiou]+");
answer = regex_replace(my_string, pattern, "");
return answer;
}