C++ 정규 표현식을 사용하여 문자열의 고정 위치 일치
C++ 정규 표현식을 사용하여 문자열의 고정 위치 일치
std::regex 라이브러리 포함
먼저, std::regex
라이브러리를 프로그램에 포함해야 합니다. 이 라이브러리는 정규 표현식을 생성하고 사용하기 위한 클래스와 함수를 제공합니다.
#include <regex>
정규 표현식 생성
일치시킬 문자열 패턴을 정규 표현식으로 표현해야 합니다. std::regex
클래스의 생성자를 사용하여 정규 표현식을 만들 수 있습니다.
std::regex pattern(R"(찾을 문자열)");
여기서 R"(찾을 문자열)"
은 찾을 문자열
을 나타내는 정규 표현식 문자열입니다. 백슬래시(\
)는 특수 문자를 나타내는 데 사용되고, ()
는 그룹을 나타냅니다.
std::regex_search 함수 사용
std::regex_search
함수를 사용하여 문자열에서 정규 표현식과 일치하는 부분을 찾을 수 있습니다. 이 함수는 두 개의 인수를 취합니다.
- 첫 번째 인수는 일치를 검색할 문자열입니다.
- 두 번째 인수는 일치할 정규 표현식을 나타내는
std::regex
객체입니다.
std::regex_search
함수는 std::cmatch
객체를 반환합니다. 이 객체는 일치하는 부분에 대한 정보를 포함합니다.
std::string text = "일치시킬 문자열이 포함된 문자열";
std::cmatch match;
if (std::regex_search(text, match, pattern)) {
// 일치가 발견됨
std::string matched_string = match[0]; // 일치하는 문자열
int start_position = match.prefix().length(); // 일치 시작 위치
int end_position = start_position + matched_string.length(); // 일치 종료 위치
std::cout << "일치하는 문자열: " << matched_string << std::endl;
std::cout << "일치 시작 위치: " << start_position << std::endl;
std::cout << "일치 종료 위치: " << end_position << std::endl;
} else {
// 일치가 없음
std::cout << "일치하는 문자열을 찾을 수 없습니다." << std::endl;
}
예제
다음은 "Hello, World!" 문자열에서 "World"를 찾는 예제입니다.
#include <regex>
int main() {
std::string text = "Hello, World!";
std::regex pattern(R"(World)");
std::cmatch match;
if (std::regex_search(text, match, pattern)) {
std::string matched_string = match[0];
int start_position = match.prefix().length();
int end_position = start_position + matched_string.length();
std::cout << "일치하는 문자열: " << matched_string << std::endl;
std::cout << "일치 시작 위치: " << start_position << std::endl;
std::cout << "일치 종료 위치: " << end_position << std::endl;
} else {
std::cout << "일치하는 문자열을 찾을 수 없습니다." << std::endl;
}
return 0;
}
위 코드에서:
pattern
정규 표현식은 "World" 문자열과 일치합니다.std::regex_search
함수는text
문자열에서pattern
과 일치하는 부분을 찾습니다.- 일치가 발견되면
matched_string
변수에 일치하는 문자열이 저장되고,start_position
변수에는 일치 시작 위치,end_position
변수에는 일치 종료 위치가 저장됩니다.
주의:
- 정규 표현식 문자열 작성 시 특수 문자를 나타내는 백슬래시(
\
)를
C++ 정규 표현식을 사용하여 문자열의 특정 위치 일치: 예제 코드
예제: 전화번호 추출
이 예제에서는 문자열에서 전화번호 패턴(010-1234-5678
)을 찾아 일치하는 부분과 시작 위치, 종료 위치를 출력합니다.
#include <iostream>
#include <regex>
int main() {
std::string text = "내 전화번호는 010-1234-5678입니다. 다른 연락처는 011-9876-5432입니다.";
std::regex pattern(R"(010-\d{4}-\d{4})"); // 전화번호 패턴
std::cmatch match;
// 문자열에서 모든 일치 항목 검색
auto it = std::regex_search(text.begin(), text.end(), match, pattern);
while (it != text.end()) {
std::string matched_string = match[0];
int start_position = match.prefix().size();
int end_position = start_position + matched_string.size();
std::cout << "일치하는 전화번호: " << matched_string << std::endl;
std::cout << "일치 시작 위치: " << start_position << std::endl;
std::cout << "일치 종료 위치: " << end_position << std::endl;
it = std::regex_search(it + 1, text.end(), match, pattern);
}
return 0;
}
설명:
pattern
정규 표현식은010-
으로 시작하고 4자리 숫자,-
, 또 다른 4자리 숫자로 구성된 문자열과 일치합니다.std::regex_search
함수는text
문자열에서pattern
과 일치하는 첫 번째 부분을 찾고,std::cmatch
객체에 일치 정보를 저장합니다.std::regex_search
함수는 반복자를 반환합니다. 이 반복자는 다음 일치 항목을 가리킵니다. 루프를 통해 반복자를 사용하여 문자열에서 모든 일치 항목을 찾을 수 있습니다.- 각 일치 항목에 대해 일치하는 문자열, 시작 위치, 종료 위치를 출력합니다.
추가 예제:
다음은 다른 예제입니다.
- 특정 문자열 뒤의 숫자 추출:
std::regex pattern(R"(찾을 문자열 뒤에 \d+)");
- 특정 형식의 날짜 추출:
std::regex pattern(R"(\d{4}-\d{2}-\d{2})");
- URL 주소 추출:
std::regex pattern(R"((https?:\/\/)(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+~#?&//=]*))");
주의 사항:
- 더 복잡한 패턴 일치를 위해서는 정규 표현식의 기능에 대해 더 자세히 알아보는 것이 필요합니다.
C++ 정규 표현식을 사용하지 않고 문자열의 특정 위치 일치
서브스트링 사용
std::substr()
함수를 사용하여 문자열의 특정 위치에 있는 서브스트링을 추출할 수 있습니다. 이 함수는 두 개의 인수를 취합니다.
- 첫 번째 인수는 시작 위치를 나타냅니다.
- 두 번째 인수는 추출할 문자열의 길이를 나타냅니다.
std::string text = "일치시킬 문자열이 포함된 문자열";
int start_position = 10; // 일치 시작 위치
int length = 5; // 일치할 문자열 길이
std::string matched_string = text.substr(start_position, length);
std::cout << "일치하는 문자열: " << matched_string << std::endl;
반복자 사용
std::begin()
및 std::end()
함수를 사용하여 문자열의 반복자를 얻을 수 있습니다. 이 반복자를 사용하여 문자열을 순회하고 특정 위치에 있는 문자열을 일치시킬 수 있습니다.
std::string text = "일치시킬 문자열이 포함된 문자열";
int start_position = 10; // 일치 시작 위치
int length = 5; // 일치할 문자열 길이
auto it = text.begin() + start_position;
std::string matched_string(it, it + length);
std::cout << "일치하는 문자열: " << matched_string << std::endl;
알고리즘 사용
std::copy_if()
알고리즘을 사용하여 특정 조건을 충족하는 문자열을 새로운 문자열로 복사할 수 있습니다.
std::string text = "일치시킬 문자열이 포함된 문자열";
int start_position = 10; // 일치 시작 위치
int length = 5; // 일치할 문자열 길이
std::string matched_string;
std::copy_if(text.begin() + start_position, text.begin() + start_position + length,
std::back_inserter(matched_string),
[](char c) { return std::isalnum(c); }); // 영문자 또는 숫자만 일치
std::cout << "일치하는 문자열: " << matched_string << std::endl;
장점:
- 정규 표현식을 사용하지 않아도 됩니다.
- 간단하고 명확한 코드를 작성할 수 있습니다.
단점:
- 정규 표현식만큼 강력하지 않을 수 있습니다.
- 복잡한 패턴 일치에는 적합하지 않을 수 있습니다.
선택 가이드:
- 간단하고 명확한 일치를 원하는 경우 서브스트링, 반복자 또는 알고리즘을 사용하는 것이 좋습니다.
- 복잡한 패턴 일치가 필요하거나 정규 표현식에 익숙한 경우 정규 표현식을 사용하는 것이 좋습니다.
위의 방법 외에도 문자열 처리 라이브러리에서 제공하는 다른 함수들을 사용하여 특정 위치 일치를 수행할 수 있습니다.
c++ regex