[2021.04.02] 정규표현식 추가 정리
-
Groups and ranges (그룹과 범위)
- | : 또는
- () : 그룹 - 찾은 것을 그룹별로 알려줌
- (?:) : 찾긴하지만 그룹으로 기억하지는 않음 - [] : 문자셋, 괄호안의 어떤 문자든 - (||)과 비슷한 효과
- 예) [a-f0-9] : a부터 f까지 혹은 0부터 9까지 찾은 - [^] : 제외
- 예) [^a-f0-9] : a부터 f까지 혹은 0부터 9까지를 제외하고 찾음
-
Quantifiers (수량)
- ? : zero or one
- : zero or more
- : one or more
- {n} : n번 반복
- {min,} : 최소
- {min, max} : 최소, 최대
-
Boundary
- \b : 단어 경계
- 예) \bYa 로 찾으면 YaYaYa 중 앞에 있는 YaYaYa로 검색- 예) Ya\b로 찾으면 YaYaYa 중 뒤에 있는 YaYaYa로 검색
- Ya 하나만을 놓고보면 둘다 경계이기 때문에 Ya 검색됨
- 예) Ya\b로 찾으면 YaYaYa 중 뒤에 있는 YaYaYa로 검색
- \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 로 검색
- \b : 단어 경계
-
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\
[email protected]\n\
[email protected]\n\
[email protected]\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;
}
Author And Source
이 문제에 관하여([2021.04.02] 정규표현식 추가 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@comdori-web/2021.04.02-정규표현식-추가-정리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)