TIL

[250107 TIL] 패턴 매칭, 문자열 검색, 치환 등의 작업에 유용한 regex

yoosorang 2025. 1. 7. 20:56

1️⃣ 알고리즘 코드카타

▪ 문자(char)도 아스키 범위 초과하면 오버플로우 발생
https://school.programmers.co.kr/learn/courses/30/lessons/12926

▪ 스위치 조건문의 조건
정수형 상수값(정수, 문자, 열거형)만 조건으로 사용 가능

https://school.programmers.co.kr/learn/courses/30/lessons/81301

 

2️⃣C++ 복습

컨테이너의 복사

//둘 다 깊은 복사(컨테이너의 대입 연산은 깊은 복사)

vector<int> vec4(vec3); 
//복사생성자 명시적으로 호출

vector<int> vec4 = vec3
//컴파일러가 내부적으로 복사 생성자 호출

 

1️⃣ 3주차 과제

🔹 좌표 이동 프로그램

C++ 라이브코딩는 너무 오래걸리고...컴파일러 로그도 불친절하군...

에러가 이 화면이면 저장이 안된 것
에러에 dotnet ~ 뜨면

https://dotnet.microsoft.com/ko-kr/download/dotnet/thank-you/sdk-6.0.428-windows-x64-installer

 

2️⃣ 추가 공부

🔹 regex

상황 : 코드카타 알고리즘 숫자열과 문자열을 regex로 푼 풀이가 있었다.

 

regex : 문자열에서 패턴 매칭, 문자열 검색, 치환 등의 작업을 쉽게 수행 가능

 

#include <regex>

 

1. regex 사용 기본 구조

  • std::regex: 정규 표현식 패턴을 정의.
  • std::regex_match: 문자열이 정규 표현식 전체와 일치하는지 확인.
  • std::regex_search: 문자열 내에 정규 표현식과 일치하는 부분이 있는지 확인.
  • std::regex_replace: 정규 표현식과 일치하는 부분을 치환.

2. 정규 표현식 기초 문법

. 임의의 문자 한 개 a.b → acb, a3b
^ 문자열의 시작 ^abc → abc
$ 문자열의 끝 abc$ → abc
* 0개 이상의 반복 a* → aaa, a
+ 1개 이상의 반복 a+ → aaa, a
? 0개 또는 1개의 반복 a? → a, 빈 문자열
{n} 정확히 n번 반복 a{3} → aaa
{n,} 최소 n번 이상 반복 a{2,} → aa, aaa
{n,m} n번 이상 m번 이하 반복 a{2,4} → aa, aaa
[] 문자 집합 [abc] → a, b, c
` ` OR 연산
\\\\d 숫자 \\\\d+ → 123, 456
\\\\w 알파벳/숫자/밑줄 ([a-zA-Z0-9_]) \\\\w+ → hello_123
\\\\s 공백 문자 (space, tab, newline) \\\\s+ → 공백

 

3. 예시

#include <iostream>
#include <regex>
using namespace std;

int main() {
    string text = "Hello, my email is example@domain.com.";
    regex pattern("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}");
		//정규 표현식 패턴을 정의하는 객체 생성

    // regex_search로 매칭 검사
    if (regex_search(text, pattern)) {
        cout << "Valid email found!" << endl;
    } else {
        cout << "No valid email found." << endl;
    }
    
    string text = "The phone number is 123-456-7890.";
    regex pattern("\\d{3}-\\d{3}-\\d{4}"); // 전화번호 패턴

    if (regex_search(text, pattern)) {
        cout << "Phone number found!" << endl;
    } else {
        cout << "Phone number not found." << endl;
    }
    
    string text = "My phone number is 123-456-7890.";
    regex pattern("\\d{3}-\\d{3}-\\d{4}");
    string result = regex_replace(text, pattern, "XXX-XXX-XXXX");

    cout << result << endl; // 출력: My phone number is XXX-XXX-XXXX.

    return 0;
}