제목대로 어떤문자를 찾는데 원하는 집합을 만들어 그것에만 해당하는것만 일치시키고싶습니다.
이전에는 마침표(.)는 모든 문자와 일치했지만
문자집합
?at 라는 글자가 있을때 ?표안에
h이나 c 나 b만 일치하는 글자를 찾고싶다고 합시다
그렇다면 hat, cat ,bat 는 일치하겠지만 pat ,qat 는 일치 하지않을겁니다.
이런 글자를 찾고싶다면 대괄호 []를 사용하여
정규표현식 [hcb]at를 사용하면됩니다.
[]안에는 집합을 의미하기 때문에 대괄호 안에 있는
문자는 모두 지합의 구성원이 되며 집합에 속한 문자 가운데 하나가 일치하게 됩니다.
예문을 볼까요?
The phrase "regular expression" is often abbreviated as RegEx or regex.
정표현식으로
[Rr]eg[Ee]x
결과는
The phrase "regular expression" is often abbreviated as RegEx or regex.
가 일치하게 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <bits/stdc++.h>
using namespace std;
void input();
string words;
int main() {
input();
cout << words << endl;
cout << "---------------------------------" << endl;
regex re("[Rr]eg[Ee]x");
sregex_iterator begin(words.begin(), words.end(), re), end;
while (begin != end) {
cout << begin->str() << endl;
begin++;
}
}
|
cs |
input은 이전 글을 읽으셨다면 생략했다는것을 아셔야합니다.
이렇게 소문자 대문자를 섞어 원하는 문자 RegEx와 regex를 찾을수있었습니다.
이번에 알려줄건 문자집합의 범위인데요
우선 이런 예문을 보겠습니다.
예문
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
정규표현식
[ns]a[0123456789]\.xls
위결과는
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
와 일치합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <bits/stdc++.h>
using namespace std;
void input();
string words;
int main() {
input();
cout << words << endl;
cout << "---------------------------------" << endl;
regex re("[ns]a[0123456789]\.xls");
sregex_iterator begin(words.begin(), words.end(), re), end;
while (begin != end) {
cout << begin->str() << endl;
begin++;
}
}
|
cs |
범위지정하기
이런식으로 정규표현식을 표현할때 숫자를 []안에 0~9까지 전부 써야한다는 단점이있습니다.
이것을 좀더 간략하게 표현하면 범위를 사용할때 정규표현식에선 하이픈(-)을 제공하여
범위를 지정하면
[0123456789] 를 ->[0-9]로 바꿔서 표현할수있습니다.
즉 위의 예문을 그대로 정규표현식을
[ns]a[0-9]\.xls
로 바꿔줄수있씁니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <bits/stdc++.h>
using namespace std;
void input();
string words;
int main() {
input();
cout << words << endl;
cout << "---------------------------------" << endl;
regex re("[ns]a[0-9]\.xls");
sregex_iterator begin(words.begin(), words.end(), re), end;
while (begin != end) {
cout << begin->str() << endl;
begin++;
}
}
|
cs |
결과물은 같으니 따로 표시하지 않겠습니다.
범위는 단지 숫자에서만 쓸쑤있는것이 아닙니다. 영문자에서도 가능한데
대문자같은 경우는 [A-Z]는 A부터 Z사이에 있는 모든 대문자와 일치하며
소문자같은경우는 [a-z]는 a부터 z사이에 있는 모든 소문자와 일치합니다
또한 [A-F] A부터 F까지사이엤는 대문자와 일치하며
대소문자같은경우 [A-Za-z]를 사용합니다.
주의사항은 [A-z]는 절대 사용하지마시길 바랍니다.
[A-z]는 아스키 문자 A와 z사이에 있는 모든 문자와 일치하며 Z-a사이에속하는 아스키 문자 중에는
[ \ ] ^ _ ` 같은 6가지 문자를 포함하게 됩니다.
그렇다면 대소문자숫자를 포함할때 어떻게 하면될까요?
[A-Za-z0-9] (순서는 상관없습니다.)
이것은 [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789] 와 같으며
범위를 지정하지않으면 코드는 매우끔찍하며
범위를 지정해야 깔끔해보인다
제외하고찾기
그다음은 문자집합은 문자의 목록을 정하는 데 쓰지만, 반대로 찾을 때 제외하고 싶은 문자목록을 정할 때도 쓸 수 있습니다.
즉 지정한 목록을 제외하기 라고도하며
캐럿(^)문자를 써 제외할 문자 집합을 지정합니다.
똑같은 예문이다
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
정규표현식
[ns]a[0-9]\.xls
결과
sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
sam.xls
na1.xls
na2.xls
sa1.xls
ca1.xls
이 예제에서는 바로 앞에 썼떤 것과 정반대 패턴을 사용했다. [0-9]는 모든 숫자와 일치한다
[^0-9]는 정해진 범위 내에 있는 숫자와 일치하지 않는다
캐럿(^) 문자는 이 문자 바로 뒤에 있는 문자나 범위뿐만 아니라 집합 안에 있는 문자나 범위를 모두 제외합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <bits/stdc++.h>
using namespace std;
void input();
string words;
int main() {
input();
cout << words << endl;
cout << "---------------------------------" << endl;
regex re("[ns]a[^0-9]\.xls");
sregex_iterator begin(words.begin(), words.end(), re), end;
while (begin != end) {
cout << begin->str() << endl;
begin++;
}
}
|
cs |
정리
대괄호[] 안에 있는 문자는 문자집합을 정의하는데, 그집합 구성원중에 한 문자라도 일치해야한다(and가 아닌 or이다)
문자 집합은 문자를 일일이 열거하거나 하이픈(-) 문자를 사용해 범위를 설정할수 있으며
캐럿(^)문자는 지정한 문자들을 제외한 어떤것들과 일치시킨다
'Regex' 카테고리의 다른 글
regex 메타 문자 사용 (0) | 2021.09.04 |
---|---|
c++ regex 모든 문자 찾기 (2) | 2021.08.31 |
c++ regex 문자 하나 찾기 (0) | 2021.08.31 |
C++ split (string 인자 여러개로 나누기, C++도 regex를 이용하여 자바나 파이썬처럼 가능합니다) (0) | 2021.08.23 |