[2021.04.02] 정규표현식 추가 정리

web comdori·2021년 4월 2일
0

관련영상
github 링크
연습용사이트

  1. Groups and ranges (그룹과 범위)

    • | : 또는
    • () : 그룹 - 찾은 것을 그룹별로 알려줌
      - (?:) : 찾긴하지만 그룹으로 기억하지는 않음
    • [] : 문자셋, 괄호안의 어떤 문자든 - (||)과 비슷한 효과
      - 예) [a-f0-9] : a부터 f까지 혹은 0부터 9까지 찾은
    • [^] : 제외
      - 예) [^a-f0-9] : a부터 f까지 혹은 0부터 9까지를 제외하고 찾음
  2. Quantifiers (수량)

    • ? : zero or one
      • : zero or more
      • : one or more
    • {n} : n번 반복
    • {min,} : 최소
    • {min, max} : 최소, 최대
  3. Boundary

    • \b : 단어 경계
      - 예) \bYa 로 찾으면 YaYaYa 중 앞에 있는 YaYaYa로 검색
      • 예) Ya\b로 찾으면 YaYaYa 중 뒤에 있는 YaYaYa로 검색
        • Ya 하나만을 놓고보면 둘다 경계이기 때문에 Ya 검색됨
    • \B : 단어 경계가 아님
      • 예) \BYa 로 찾으면 YaYaYa 중 YaYaYa로 검색
      • 예) Ya\B로 찾으면 YaYaYa 중 뒤에 있는 YaYaYa로 검색
        • Ya 하나만을 놓고보면 둘다 경계이기 때문에 검색되지 않음
    • ^ : 문장의 시작
      - 예) ^Ya로 찾으면 Ya ya YaYaYa Ya 중 Ya ya YaYaYa Ya 로 검색
    • $ : 문장의 끝 (플래그에 multiline이 안되어 있으면... 전체문장중에만 찾음)
      - 예) $Ya로 찾으면 Ya ya YaYaYa Ya 중 Ya ya YaYaYa Ya 로 검색
  4. Character classes

    • . : 모든 문자 (새로운줄바꿈 문자 제외)
    • \ : 특수문자가 아닌 문자
      - . : 문자 . 검색
      • \? : 문자 ? 검색
      • [ : 문자 [ 검색
    • \d : 숫자(digit)
    • \D : 숫자가 아닌 모든문자
    • \w : 숫자를 포함한 모든문자(word) - 특수문자, 공백 제외
    • \W : 숫자를 포함한 모든문자를 제외한 특수문자, 공백 등
    • \s : 공백(space)
    • \S : 공백을 제외한 나머지

주의

  • C++에서 \d를 하니깐... digit 검색이 되지 않았다.. \d를 사용해야한다.

퍼옴

Notice that, in C++, character and string literals also escape characters using the backslash character (\), and this affects the syntax for constructing regular expressions from such types. For example:
1 std::regex e1 ("\\d");  // regular expression: \d -> matches a digit character
2 std::regex e2 ("\\\\"); // regular expression: \\ -> matches a single backslash (\) character 

c++에서 string에서 **는 escape 로 사용되기 때문에... **를 사용하기 위해서는 \로 써야한다.

  • 예1) \d : \d : 숫자
  • 예2) \\ : \ : 문자 \
  • [] 안에서는 특수문자 바꿔줄 필요는 없어보임
    - 밖에서 \.을 써야 문자 . 을 나타내지만, [.] 문자셋 안에서는 .으로 써도 되는듯
    • regex reg("[.]{3}"); 하니까 "..."이 검색됨!

연습

#include <iostream>
#include <string>
#include <regex>

using namespace std;

vector<string> getMatches(string str, regex reg)
{
	vector<string> matches;

	// sregex_iterator 내, begin(), end(), reg를 저장하여 순회 가능
	sregex_iterator curMatch(str.begin(), str.end(), reg);
	// lastMatch는 end로 초기화됨
	sregex_iterator lastMatch;

	while (curMatch != lastMatch) {
		smatch match = *curMatch;
		matches.push_back(match.str());
		curMatch++;
	}

	// match.str() // match된 string
	// match.prefix() // match된 string 앞 부분
	// match.suffix() // match된 string 뒷 부분

	return matches;
}

vector<string> getCaptures(string str, regex reg)
{
	vector<string> matches;

	// sregex_iterator 내, begin(), end(), reg를 저장하여 순회 가능
	sregex_iterator curMatch(str.begin(), str.end(), reg);
	// lastMatch는 end로 초기화됨
	sregex_iterator lastMatch;

	while (curMatch != lastMatch) {
		smatch match = *curMatch;
		matches.push_back(match[1]);
		curMatch++;
	}

	// match.str() // match된 string
	// match.prefix() // match된 string 앞 부분
	// match.suffix() // match된 string 뒷 부분

	return matches;
}

int main()
{
	string str = "\
Hi there, Nice to meet you. And Hello there and hi.\n\
I love grey(gray) color not a gry, graayand graaay.grdy\n\
Ya ya YaYaYa Ya\n\
abcdefghijklmnopqrstuvwxyz\n\
ABSCEFGHIJKLMNOPQRSTUVWZYZ\n\
1234567890\n\
.[]{}()\^$|?*+\n\
010-898-0893\n\
010 898 0893\n\
010.898.0893\n\
010-405-3412\n\
02-878-8888\n\
dream.coder.ellie@gmail.com\n\
hel+lo@daum.net\n\
hello@daum.co.kr\n\
...\n\
http://www.youtu.be/-ZClicWm0zM\n\
https://www.youtu.be/-ZClicWm1zM\n\
https://youtu.be/-ZClicWm2zM\n\
youtu.be/-ZClicWm3zM";

	regex reg1("\\d{2,3}[- .]\\d{3}[- .]\\d{4}"); // 전화번호 검색
	regex reg2("[\\w+-._]+@[\\w+-._]+"); // 이메일 검색
	regex reg3("(?:https?:\\/\\/)?(?:www\\.)?youtu\\.be\/([a-zA-Z0-9-]+)"); // 유튜브에서 ID만 가져오기...

	//vector<string> matches = getMatches(str, reg3);
	vector<string> matches = getCaptures(str, reg3);

	for (int i = 0; i < matches.size(); i++) {
		cout << i << " : " << matches[i] << endl;
	}
	return 0;
}
profile
(wanna be a) Full-Stack Engineer

0개의 댓글