정규 표현식(Regular Expression, Regex)은 특정 패턴을 가진 문자열을 찾거나 수정하는 데 사용되는 도구다. <regex> 헤더를 사용해서 정규 표현식을 다룰 수 있다. 문자열 검색, 데이터 검증, 텍스트 치환 등의 작업에 유용하게 사용된다.
| 클래스 | 설명 |
|---|---|
std::regex | 정규 표현식을 정의하는 클래스 |
std::smatch | 문자열 매칭 결과를 저장하는 클래스 |
std::regex_match | 전체 문자열이 정규 표현식과 일치하는지 확인 |
std::regex_search | 문자열 내에서 정규 표현식과 일치하는 부분을 검색 |
std::regex_replace | 정규 표현식에 일치하는 부분을 다른 문자열로 치환 |
#include <regex>
int main() {
std::string text = "이메일: example@test.com, 전화번호: 010-1234-5678";
// 이메일 패턴
std::regex email_pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})");
std::smatch email_match;
// regex_search: 텍스트에서 정규 표현식에 맞는 부분 검색
if (std::regex_search(text, email_match, email_pattern)) {
std::cout << "추출된 이메일: " << email_match[0] << std::endl;
}
// 전화번호 패턴
std::regex phone_pattern(R"(01[0-9]-\d{3,4}-\d{4})");
std::smatch phone_match;
if (std::regex_search(text, phone_match, phone_pattern)) {
std::cout << "추출된 전화번호: " << phone_match[0] << std::endl;
}
return 0;
}
| 패턴 | 설명 | 예시 |
|---|---|---|
[abc] | a, b, c 중 하나와 일치 | [aeiou] → 모든 모음 |
[a-z] | 소문자 알파벳과 일치 | [a-zA-Z] → 모든 알파벳 |
\d | 숫자와 일치 ([0-9]와 동일) | \d{3} → 3자리 숫자 |
\w | 알파벳, 숫자, 밑줄(_) 문자와 일치 | \w+ → 단어와 일치 |
\s | 공백 문자(스페이스, 탭, 줄바꿈 등)와 일치 | \s+ → 공백 하나 이상과 일치 |
^ | 문자열 시작 | ^Hello → "Hello"로 시작하는 문자열 |
$ | 문자열 끝 | end$ → "end"로 끝나는 문자열 |
. | 임의의 한 문자와 일치 | a.c → "abc", "a9c" |
* | 0개 이상의 반복 | fo* → "f", "fo", "foo" |
+ | 1개 이상의 반복 | fo+ → "fo", "foo" |
? | 0개 또는 1개의 반복 | colou?r → "color", "colour" |
| ` | ` | OR 조건 |
() | 그룹 | (abc)+ → "abc", "abcabc" |
문자열에서 정규 표현식에 일치하는 부분을 찾아 다른 문자열로 치환하는 함수다. 특정 패턴을 찾아 원하는 형식으로 바꿀 때 사용된다.
std::string regex_replace(const std::string& input,
const std::regex& pattern,
const std::string& replacement,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
input: 대상 문자열pattern: 치환할 패턴(정규 표현식)replacement: 일치한 부분을 대체할 문자열flags: 치환 방식에 영향을 미치는 플래그 (선택 사항)| 플래그 | 설명 |
|---|---|
std::regex_constants::match_default | 기본 동작으로, 모든 패턴을 찾아 치환 |
std::regex_constants::format_no_copy | 일치하지 않는 부분은 복사하지 않음 |
std::regex_constants::format_first_only | 첫 번째 일치 항목만 치환하고 나머지는 유지 |
#include <regex>
int main() {
std::string text = "오늘 날씨는 좋다. 날씨가 정말 좋다.";
std::regex pattern("날씨");
std::string replaced_text = std::regex_replace(text, pattern, "기분");
std::cout << "치환된 문자열: " << replaced_text << std::endl;
return 0;
}
출력 결과
치환된 문자열: 오늘 기분은 좋다. 기분가 정말 좋다.
문자열이 정규 표현식과 완전히 일치하는지 확인하는 함수다. 문자열 전체가 주어진 정규 표현식과 일치해야 true를 반환한다.
bool regex_match(const std::string& input,
std::smatch& result,
const std::regex& pattern,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
bool regex_match(const std::string& input,
const std::regex& pattern,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
input: 일치 여부를 검사할 문자열result: 일치한 부분의 정보를 저장할 객체(std::smatch)pattern: 비교할 정규 표현식flags: 일치 방식에 영향을 주는 플래그 (선택 사항)| 플래그 | 설명 |
|---|---|
std::regex_constants::match_default | 기본 동작으로, 전체 문자열이 정규 표현식과 완전히 일치해야 true |
std::regex_constants::match_not_bol | 문자열의 시작을 무시 (^ 앵커 무시) |
std::regex_constants::match_not_eol | 문자열의 끝을 무시 ($ 앵커 무시) |
#include <regex>
int main() {
std::string text = "hello";
std::regex pattern(R"([a-z]+)");
if (std::regex_match(text, pattern)) {
std::cout << "문자열이 정규 표현식과 완전히 일치합니다." << std::endl;
} else {
std::cout << "문자열이 정규 표현식과 일치하지 않습니다." << std::endl;
}
return 0;
}
출력 결과:
문자열이 정규 표현식과 완전히 일치합니다.
문자열 내에 정규 표현식과 일치하는 부분이 존재하는지 검사하는 함수다. std::regex_match와 달리 부분 일치를 허용하며, 일치하는 모든 부분을 찾을 수 있다.
bool regex_search(const std::string& input,
std::smatch& result,
const std::regex& pattern,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
bool regex_search(const std::string& input,
const std::regex& pattern,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
input: 검사할 문자열result: 일치한 부분의 정보를 저장할 객체(std::smatch)pattern: 비교할 정규 표현식flags: 일치 방식에 영향을 주는 플래그 (선택 사항)| 플래그 | 설명 |
|---|---|
std::regex_constants::match_default | 기본 동작으로, 문자열에서 정규 표현식과 일치하는 첫 번째 부분을 찾음 |
std::regex_constants::match_not_bol | 문자열의 시작(^ 앵커)을 무시하고 검색 |
std::regex_constants::match_not_eol | 문자열의 끝($ 앵커)을 무시하고 검색 |
#include <regex>
int main() {
std::string text = "The quick brown fox jumps over the lazy dog";
std::regex pattern(R"(quick)");
if (std::regex_search(text, pattern)) {
std::cout << "문자열에 'quick'이 포함되어 있습니다." << std::endl;
} else {
std::cout << "문자열에 'quick'이 포함되어 있지 않습니다." << std::endl;
}
return 0;
}
문자열에 'quick'이 포함되어 있습니다.
std::regex_search는 정규 표현식과 일치하는 부분이 문자열 내에 존재하는지만 확인하며, 부분 일치만으로도 true를 반환한다.