[C++] 정규표현식

다곰·2023년 3월 10일
0

정규 표현식 ➡️ 문자열에서 패턴 찾는데 사용

  1. 주어진 문자열이 주어진 규칙에 맞는지 확인
  2. 주어진 문자열에서 원하는 패턴 문자열 검색
  3. 주어진 문장에서 원하는 패턴의 문자열로 치환

✅ 라이브러리: regex

1. 전체 문자열 매칭: regex_match

✏️ 예시 code

// 문자열이 db-숫자-log.txt 형식인지 확인
regex re("db-\\d*-log\\.txt");	

// file_name 이 regex 형식에 맞으면 true, 아니면 false 반환
regex_match(file_name, re);	

⭐️ 파리미터
icase: 대소문자 구별 X

2. 부분 문자열 매칭

✏️ 예시 code
regex re("[01]{3}-(\\d{3,4})-\\d{4}")
➡️ [01]{3}: 0 또는 1 이 3번 나타남
➡️ \\d{3,4}: 숫자가 3-4 번 나타남
➡️ \\d{4}: 숫자가 4 번 나타남

⭐️ 파리미터
smatch: 매칭된 문자열을 string 형태로 return
cmatch: 매칭된 문자열을 char* 형태로 return

탐색할 문자열에서 정규표현식 패턴을 가진 문자열이 있으면 0, 없으면 1

✏️ 예시 code

regex_search(탐색할 문자열, match, re);
탐색할 문자열=match.suffix();

❗️ match.suffix(): 문자열에서 검색된 패턴 바로 뒤부터 끝까지의 문자열
끝까지 탐색할 때까지 한번 찾으면 탐색할 문자열을 match.suffix() 로 갱신해줘야 다음으로 찾으려는 패턴에 부합하는 문자열을 찾을 수 있음
그렇지 않으면 첫번째로 패턴을 만족하는 문자열만 계속 출력됨

⭐️ regex_iterator ➡️ 정규표현식을 만족하는 문자열 쭉 뽑아내기

✏️ 예시 code

regex_iterator(탐색할 문자열.begin(), 탐색할 문자열.end(), re);

4. 원하는 패턴 치환하기: regex_replace

✏️ 예시 code

  1. sk-circle1 ➡️ 1-sk-circle 형태로 변환
// 형변환을 할 숫자부분 괄호로 묶어주기
regex re(R"r(sk-circle(\d))r");	

// 괄호로 묶은 부분을 옮겨줄 위치 $1로 표기
regex_replace(치환 대상 문자열, re, "$1-sk-circle");
  1. sk-circle1 sk-circle ➡️ 1-sk-circle 형태로 중첩 변환
    sk-circle 을 아예 날려줘야하기 때문에 숫자 이외의 문자열 전체를 변환 대상으로 설정해야 함
// 1. 형변환을 할 문자열 전체 괄호로 묶어주기
// 2. 형변환을 할 숫자부분 괄호로 묶어주기
regex re(R"r((sk-circle(\d) sk-circle))r");

// 문자열 전체에 대한 괄호: $1, 숫자에 대한 괄호: $2
// $1은 아예 삭제할 문자열이기 때문에 날려버리고 $2는 형변환 해서 붙여줄 숫자이기 때문에 문자열 맨 앞에 붙이는 형식
regex_replace(치환 대상 문자열, re, "$2-sk-circle");

❗️$1$2 는 괄호가 열린 순서대로 오름차순으로 매기는 것

5. 정규표현 기호

  • 문자 하나만 있을 경우: 문자열이 해당 문자를 포함하기만 하면 됨
  • []: 문자 클래스
    ex) [A-Z]: A 부터 Z 중에 하나를 포함
    ex) [abc]d: ad, bd, cd
  • [^]: 부정 ex) [A-Z]: A 부터 Z 를 포함하지 않음
  • ^: 문자열이나 행의 처음
  • $: 문자열이나 행의 끝
  • *: 0개 이상의 문자 포함 ex) a*b: a 와 b 사이에 0개 이상의 문자 포함
  • {m,n}: m 회 이상, n 회 이하로 문자 포함 ex) a{1,3}b: a 를 1번 이상, 3번 이하 포함
  • ?: 0-1 회 문자 포함
  • {n}[문자 or 숫자]: 문자 n 회 포함
  • {min,}[문자 or 숫자]: 문자 min 번 이상 포함

https://modoocode.com/303

profile
다교미의 불꽃 에러 정복기

0개의 댓글