본문 바로가기
Regex

c++ regex 모든 문자 찾기

by 콩순이냉장고 2021. 8. 31.

정규 표현식에서 모든 문자와 대칭되는 글자는 마침표(.) 입니다. 이문자는 어떤문자든상관없이 전부일치합니다.

예를들어 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.txt

그리고

현재는 input을 보여주지만

다음부터는 input과 input코드는 생략해서 보여드리도록 하겠습니다.