개요
오늘 알고리즘 문제를 하나 풀었다. 어려운 문제는 아니였지만 주어진 문자열에서 "zero", "one"처럼 문자로 써진 숫자를 진짜 숫자로 치환하는 부분이 있었는데 나는 하나하나 if else로 문제를 해결했다.
하지만 정규표현식으로 바꾸면 훨씬 간단히 해결된다는 것을 알고 regex 사용법을 알아봤다..
https://school.programmers.co.kr/learn/courses/30/lessons/81301
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
정규 표현식?
정규 표현식은 문자열에서 패턴을 찾는데 주로 사용하는데 사용 상황을 정리해보면
- 주어진 문자열이 주어진 규칙에 맞는지 확인할 때
- 주어진 문자열에서 원하는 패턴의 문자열을 검색할 때
- 주어진 문자열에서 원하는 패턴의 문자열로 치환할 때
일단 정규 표현식의 예시를 보자
/d* 는 임의의 개수의 숫자를 나타내고, \.은 .자체가 임의의 문자를 의미하기 때문에 문자 . 자체를 찾기 위해 붙여줬다.
db-\d*-log\.txt
해당 정규 표현식으로는 다음과 같은 패턴의 문자열을 모두 찾을 수 있다.
"db-123-log.txt"
"db-124-log.txt"
"db-12-log.txt"
"db-12-log.jpg" //찾지 못함
"not-db-log.txt" //찾지 못함
이렇듯 정규 표현식을 사용하면 특정 패턴을 가진 문자열의 정보를 얻을 수 있다.
regex
c++에서는 regex를 사용해 정규표현식을 사용할 수 있다.
regex로 다음과 같이 정규표현식을 선언할 수 있다.
regex를 이용해 다음과 같은 연산을 수행할 수 있다.
- bool regex_match(string , regex)
- smatch 사용 -> bool regex_match(string, cmatch, regex)
- void regex_search(string, smatch, regex)
- void regex_replace(string, regex, string back reference)
std::regex re("db-\\d*-log\\.txt");
regex_match
#include <regex>
int main () {
std::vector<std::string> file_names = {"db-123-log.txt", "db-124-log.txt",
"not-db-log.txt", "db-12-log.txt",
"db-12-log.jpg"};
std::regex re("db-\\d*-log\\.txt"); //regex 선언
for (const auto &file_name : file_names) {
std::cout << file_name << ": " << std::boolalpha
<< std::regex_match(file_name, re) << '\n';
}
}
cmatch
#include <iostream>
#include <regex>
#include <vector>
int main() {
std::vector<std::string> phone_numbers = {"010-1234-5678", "010-123-4567",
"011-1234-5567", "010-12345-6789",
"123-4567-8901", "010-1234-567"};
std::regex re("[01]{3}-(\\d{3,4})-\\d{4}");
std::smatch match; // 매칭된 결과를 string 으로 보관
for (const auto &number : phone_numbers) {
if (std::regex_match(number, match, re)) {
for (size_t i = 0; i < match.size(); i++) {
std::cout << "Match : " << match[i].str() << std::endl;
}
std::cout << "-----------------------\n";
}
}
}
regex_search
#include <iostream>
#include <regex>
int main() {
std::string html = R"(
<div class="social-login">
<div class="small-comment">다음으로 로그인 </div>
<div>
<i class="xi-facebook-official fb-login"></i>
<i class="xi-google-plus goog-login"></i>
</div>
</div>
<div class="manual">
<div class="small-comment">
또는 직접 입력하세요 (댓글 수정시 비밀번호가 필요합니다)
</div>
<input name="name" id="name" placeholder="이름">
<input name="password" id="password" type="password" placeholder="비밀번호">
</div>
<div id="adding-comment" class="sk-fading-circle">
<div class="sk-circle1 sk-circle">a</div>
<div class="sk-circle2 sk-circle">b</div>
<div class="sk-circle3 sk-circle">asd</div>
<div class="sk-circle4 sk-circle">asdfasf</div>
<div class="sk-circle5 sk-circle">123</div>
<div class="sk-circle6 sk-circle">aax</div>
<div class="sk-circle7 sk-circle">sxz</div>
</div>
)";
std::regex re(R"(<div class="sk[\w -]*">\w*</div>)");
std::smatch match;
while (std::regex_search(html, match, re)) {
std::cout << match.str() << '\n';
html = match.suffix();
}
}
regex_replace
#include <iostream>
#include <regex>
int main() {
std::string html = R"(
<div class="social-login">
<div class="small-comment">다음으로 로그인 </div>
<div>
<i class="xi-facebook-official fb-login"></i>
<i class="xi-google-plus goog-login"></i>
</div>
</div>
<div class="manual">
<div class="small-comment">
또는 직접 입력하세요 (댓글 수정시 비밀번호가 필요합니다)
</div>
<input name="name" id="name" placeholder="이름">
<input name="password" id="password" type="password" placeholder="비밀번호">
</div>
<div id="adding-comment" class="sk-fading-circle">
<div class="sk-circle1 sk-circle">a</div>
<div class="sk-circle2 sk-circle">b</div>
<div class="sk-circle3 sk-circle">asd</div>
<div class="sk-circle4 sk-circle">asdfasf</div>
<div class="sk-circle5 sk-circle">123</div>
<div class="sk-circle6 sk-circle">aax</div>
<div class="sk-circle7 sk-circle">sxz</div>
</div>
)";
std::regex re(R"r(sk-circle(\d))r");
std::smatch match;
std::string modified_html = std::regex_replace(html, re, "$1-sk-circle");
std::cout << modified_html;
}
Reference
씹어먹는 C++ - <17 - 2. C++ 정규 표현식(<regex>) 라이브러리 소개>
std::regex 를 통해서 정규 표현식 객체를 생성할 수 있습니다. std::regex_match 로 전체 문자열이 패턴을 만족하는지 확인할 수 있습니다. std::regex_search 를 통해 패턴에 맞는 문자열을 검색할 수 있습
modoocode.com
'C++' 카테고리의 다른 글
[C++ Project] 등급별 아이템 (0) | 2025.01.13 |
---|---|
[C++ Project] text기반 게임 기획 (0) | 2025.01.10 |
[C++] STL queue (0) | 2024.12.30 |
[C++]STL stack (0) | 2024.12.29 |
[C++] STL Map (1) | 2024.12.23 |