정규 표현식에서 모든 문자와 대칭되는 글자는 마침표(.) 입니다. 이문자는 어떤문자든상관없이 전부일치합니다.
예를들어 c.t 라는 정규표현식을 이용하여 문자들을 찾을때
cat 나 cot, cut 등 .에 해당하는 모든문자와 일치하기 하게 됩니다.
그리고 c++에선 여러가지 문자열들이 있을때 모든문자들을 어떻게 찾으면 될까요??
여기선 두가지 방법을 설명해드리겠습니다.
regex_search를 이용하는방법과 sregex_iterator를 사용하는방법
sales.xls
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
가 있을때
정규표현식
sales.는 어떤문자와 일치하는지
sales.xls
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
regex_search를 이용하는 방법을 한번볼까요?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <bits/stdc++.h>
using namespace std;
int main() {
string words = "sales.xls\nsales1.xls\norders3.xls\nsales2.xls\nsales3.xls\napac1.xls";
cout << words << endl;
cout << "---------------------------------" << endl;
smatch match;
while (regex_search(words, match, regex("sales."))) {
cout << match[0] << endl;
words=match.suffix();
}
}
|
cs |
그렇다면 정말 마침표 .만 찾고싶을때 어떻게해야할까요??
c나 c++ 자바에 escape문자열이 있듯이 정규표현식에서도 escape문자열이 있습니다.
\.를 이용하여 마침표(.)을 찾을수 있습니다.
이번엔 예문으로
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
eruope2.xls
na1.xls
na2.xls
sa1.xls
정규표현식
.a.\.xls
일치하는 문자열은
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
eruope2.xls
na1.xls
na2.xls
sa1.xls
c++에선 이번엔 regex_search 가아닌 sregex_iterator를 통해서 찾아보겠습니다.
sregex_iterator는 regex_iterator<string::iterator>를 간략하게 사용할수있는 stl입니다.
앞으로 문자열 입력은
freopen을 이용하여 input()함수로 따로만들어 input.txt로 대체하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <bits/stdc++.h>
using namespace std;
void input();
string words;
int main() {
input();
cout << words << endl;
cout << "---------------------------------" << endl;
regex re(".a.\\.xls");
sregex_iterator begin(words.begin(),words.end(),re), end;
while (begin != end) {
cout << begin->str() << endl;
begin++;
}
}
void input() {
freopen("input.txt", "r", stdin);
string s;
while (getline(cin, s)) {
words += s+"\n";
}
words.pop_back();
}
|
cs |
sregex_iterator를 이용하여 해당일치하는 문자를 찾았습니다.
regex_search를 이용하여 suffix를 통해서 반복된것을 찾았는데
sergex_iterator를 이용하여 반복되는 일치하는것을 찾는방법이있습니다.
둘중 사용하는것이 편리한것을 사용하면되겠지만
좀더 스피드적으로 빠르게 찾기위해선 sregex_iterator를 사용하는것을 권장합니다.
그리고 regex re(".a.\\.xls"); 여기서 .a.\.xls를 사용할줄알았는데 \\를 사용했씁니다.
왜그럴까요? c++ 이나 c ,java같은경우 \를 표현하기위해 \\를 두번 사용해서 \\를 표현할수있습니다.
즉 c++내부에서 escape를 피해야하는것이죠 하지만 매번 이렇게 사용하기엔 귀찮습니다.
그래서 c++에선 리터럴 상수문자열을 제공하는데
regex re(".a.\\.xls"); R"()" 입니다. 괄호안에 문자열을 집어넣으시면되는데
간편한점은 c++에서 제공하는 escape문자열을 무시하여 그대로 출력합니다. 그렇다면regex re(R"(.a.\.xls)");로바꿔서 사용해도 결과가 동일합니다.
그리고
현재는 input을 보여주지만
다음부터는 input과 input코드는 생략해서 보여드리도록 하겠습니다.
'Regex' 카테고리의 다른 글
regex 메타 문자 사용 (0) | 2021.09.04 |
---|---|
c++ regex 문자 집합(여러 문자 중 하나와 일치시키기) (0) | 2021.09.04 |
c++ regex 문자 하나 찾기 (0) | 2021.08.31 |
C++ split (string 인자 여러개로 나누기, C++도 regex를 이용하여 자바나 파이썬처럼 가능합니다) (0) | 2021.08.23 |