# 정규표현식이란?(Regular Expression: Regex)
정규표현식은 "특정 패턴의 문자열"을 찾기 위한 표현 방식입니다.
(이런걸 형식 언어, formal languange라고 합니다.)
정규표현식을 이용하면, 특정 패턴에 매칭되는 문자열을 쉽게(?) 찾아낼 수 있습니다.
예를 들어 010-1111-2222 라는 전호번호는
"숫자3개", "-", "숫자4개", "-", "숫자4개" 로 이루어져 있는데,
정규표현식으로 아래와 같이 패턴을 만들어주면,
특정 문자열이 해당 패턴에 맞는지 체크할 수 있습니다.
const regex = /\d{3}-\d{4}-\d{4}/;
// (\d는 숫자를 의미하고, {} 안의 숫자는 갯수를 의미한다.)
regex.test('010-1111-2222') // true;
regex.test('01-11-22') // false;
물론 수많은 문자들 중에서 전화번호만 발라낼 수도 있습니다.
const text = "안녕하세요 제 번호는 010-1111-2222 입니다. call me~!";
text.match(/\d{3}-\d{4}-\d{4}/); // 010-1111-2222
수많은 데이터를 다루고, 원하는 정보만 발라내야할 때 아주아주 유용하기 때문에,
기본적인 사용법을 알아두면 큰 도움이 됩니다.
지금부터 아주 쉽게, 그리고 상세하게 정규표현식의 기초를 정리해보겠습니다.
#. 정규표현식 활용 예시
먼저 아래 문장을 정규표현식으로 주물러 보겠습니다.
"대나무 빨대 a급 제품은 10개 남아있습니다. 010-1111-2222 로 Call Me~!"
/대/ : '대'를 '하나'만 찾는다.
=> 대나무 빨대 a급 제품은 10개 남아있습니다. 010-1111-2222 로 Call Me~!
/대/g: '대'를 '모두' 찾는다
=> 대나무 빨대 a급 제품은 10개 남아있습니다. 010-1111-2222 로 Call Me~!
* g(global) 플래그를 뒤에 붙인걸 기억하세요.
/대나무 빨대/: '대나무 빨대'를 찾는다.
=> 대나무 빨대 a급 제품은 10개 남아있습니다. 010-1111-2222 로 Call Me~!
/[대a0]/g: "대", "a", 0 중에 하나를 모두 찾는다.
=> 대나무 빨대 a급 제품은 10개 남아있습니다. 010-1111-2222 로 Call Me~!
* 대괄호[]는 OR의 기능을 합니다.
/[0-9]/g : '숫자0~9'를 모두 찾는다.
=> 대나무 빨대 a급 제품은 10개 남아있습니다. 010-1111-2222 로 Call Me~!
/[a-zA-Z]/g : '영어알파벳 대문자/소문자'를 모두 찾는다.
=> 대나무 빨대 a급 제품은 10개 남아있습니다. 010-1111-2222 로 Call Me~!
/[^0-9]/g : '숫자0~9'가 아닌 것을 모두 찾는다.
=> 대나무 빨대 a급 제품은 10개 남아있습니다. 010-1111-2222 로 Call Me~!
* 대괄호[] 안에서 앞에 ^를 쓰면, 부정(Not)의 기능을 합니다.
어떠신가요? 생각보다 쉽죠?
그럼 이제 본격적으로 정규표현식의 형식과 패턴, 플래그, 메서드를 정리해보겠습니다.
# 정규표현식 사용법 정리
1. 정규표현식 형식
/패턴/플래그
- 슬래시(/) "사이"에는 매칭시킬 "패턴"을 써준다.
- 슬래시(/) "다음"에는 옵션을 설정하는 "플래그"를 써준다.
(플래그는 하나만 찾을지, 모두 다 찾을지 등을 설정하는 옵션이라고 보면 됩니다.)
2. 정규표현식 매칭 패턴(문자, 숫자, 기호 등)
: 아래 매칭 패턴을 사용하면, 훨씬 쉽게 문자/숫자/기호를 표현할 수 있습니다.
패턴 | 의미 |
a-zA-Z | 영어알파벳(-으로 범위 지정) |
ㄱ-ㅎ가-힣 | 한글 문자(-으로 범위 지정) |
0-9 | 숫자(-으로 범위 지정) |
. | 모든 문자열(숫자, 한글, 영어, 특수기호, 공백 모두! 단, 줄바꿈X) |
\d | 숫자 |
\D | 숫자가 아닌 것 |
\w | 영어 알파벳, 숫자, 언더스코어(_) |
\W | /w 가 아닌 것 |
\s | space 공백 |
\S | space 공백이 아닌 것 |
\특수기호 | 특수기호 |
3. 정규표현식 검색 패턴
: 아래 패턴들을 이용하면, AND, OR, StartWith, EndWith 등의 다양한 조합을 만들 수 있습니다.
기호 | 의미 |
| | OR |
[] | 괄호안의 문자들 중 하나 |
[^문자] | 괄호안의 문자를 제외한 것 |
^문자열 | 특정 문자열로 시작(괄호 없음 주의!) |
문자열$ | 특정 문자열로 끝남 |
() | 그룹 검색 및 분류(match메서드에서 그룹별로 묶어줌) |
(?: 패턴) | 그룹 검색(분류X) |
\b | 단어의 처음/끝 |
\B | 단어의 처음/끝이 아님 |
4. 정규표현식 갯수(수량) 패턴
: 특정 패턴이 몇번 반복되는지도 필터링 가능합니다.
기호 | 의미 |
? | 최대 한번(없음 || 한개) |
* | 없거나 있거나 (없음 || 있음): 여러개 포함 |
+ | 최소 한개(한개 || 여러개) |
{n} | n개 |
{Min,} | 최소 Min개 이상 |
{Min, Max} | 최소 Min개 이상, 최대 Max개 이하 |
5. 정규표현식 플래그
: 플래그는 동시에 여러개 사용할 수도 있습니다. 예) gi, gm 등
플래그 | 의미 |
g | Global: 모든 문자 검색(안 쓰면 매칭되는 첫 문자만 검색) |
i | Ignore Case: 대소문자 구분 안함 |
m | Multi line: 여러 행의 문자열에 대해 검색 |
* 이외에 Singleline, Unicode, Sticky 옵션도 있는데, 잘 쓰진 않는듯 합니다.
6. 정규표현식 주요 메서드
: 자바스크립트 코드 상에서는 아래 메서드를 통해 패턴을 검사하고, .매칭되는 문자열을 추출, 변환합니다.
메서드 | 의미 |
("문자열").match(/정규표현식/플래그) | "문자열"에서 "정규표현식"에 매칭되는 항목들을 배열로 반환 |
("문자열").replace(/정규표현식/, "대체문자열") | "정규표현식"에 매칭되는 항목을 "대체문자열"로 변환 |
("문자열").split(정규표현식) | "문자열"을 "정규표현식"에 매칭되는 항목으로 쪼개어 배열로 반환 |
(정규표현식).test("문자열") | "문자열"이 "정규표현식"과 매칭되면 true, 아니면 false반환 |
(정규표현식).exec("문자열") | match메서드와 유사(단, 무조건 첫번째 매칭 결과만 반환) |
갑자기 많은 양이 나와서 놀라실 수도 있는데,
실제 사용하는 자바스크립트 코드를 보시면, 훨씬 이해가 쉬우실 겁니다.
# 정규표현식 활용 샘플 코드
1. 웹사이트 주소 정규표현식
: http:// 나 https://로 시작하고, 알파벳, 어더스코어(_), 하이픈(-), dot(.)으로 이루어져 있습니다.
const text = `대나무 빨대 구입 문의 : http://dogumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com`;
text.match(/https?:\/\/[\w\-\.]+/g);
// ["http://dogumaster.com", "http://google.com"]
여기서 사용된 정규표현식을 해석해보겠습니다.
/https?:\/\/[\w\-\.]+/g
1) http => 로 시작하고,
2) s? => 다음에 s는 없거나 있고,
3) : => 다음에 : 가 오고,
4) \/\/ => 다음에 특수기호 // 가 오고
5) [\w\-\.]+ => \w(영문자, 언더스코어), 하이픈, 쩜 으로 이루어진 문자열이 한개 이상(+) 있다.
6) g => 매칭되는걸 모두 다 찾는다.(플래그)
2. 전화번호 정규표현식
: 유선번호라면 02-111-2222 형식이고, 핸드폰번호라면 010-1111-2222 형식입니다. 숫자의 갯수가 다릅니다.
const text = `대나무 빨대 구입 문의 : http://dogumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com`;
text.match(/\d{2,3}-\d{3,4}-\d{4}/g);
// [ '010-1111-2222', '02-333-7777' ]
/\d{2,3}-\d{3,4}-\d{4}/g
1) \d{2,3} => 숫자 2~3개로 시작하고,
2) \- => 다음에 하이픈(-)이 오고
3) \d{3, 4} => 다음에 숫자가 3~4개 오고,
4) \- => 다음에 하이픈(-)이 오고,
5) \d{4} => 다음에 숫자가 4개 온다.
6) g => 매칭되는걸 모두 다 찾는다(플래그)
3. 이메일주소 정규표현식
: xxx@xxxx.com 등의 형식이니, 쉽게 만들 수 있겠죠?
const text = `대나무 빨대 구입 문의 : http://dogumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com`;
text.match(/[\w\-\.]+\@[\w\-\.]+/g); // [ 'curryyou@aaa.com' ]
좀더 엄격한 검사가 필요하다면, 상황에 맞게 수정해서 사용하시면 되겠습니다.
4. 특수기호 정규표현식
1) 모든 특수기호를 나열
: 빼먹을수도 있는 단점이 있지만, 원하는 특수기호만 선택해서 검사할 수 있는 장점이 있습니다.
const regex = /\[\]\{\}\/\(\)\.\?\<\>!@#$%^&*/g
2) 문자와 숫자가 아닌것을 매칭
: [^문자] 패턴으로 Not 기능을 적용했습니다.
const regex = /[^a-zA-Z0-9가-힣ㄱ-ㅎ]/g
이것으로 정규표현식 기초 정리를 마치겠습니다.
참고로, 정규표현식은 자바스크립트의 전유물이 아니라, 대부분의 프로그래밍 언어에서 지원되는 형식 언어입니다.
하지만 사용방식은 조금씩 상이할 수 있으니 유의하시기 바랍니다.
그럼 도움이 되시길 바라겠습니다.
'개발(Development) > JS(자바스크립트)' 카테고리의 다른 글
[자바스크립트] 점 3개 ... : Rest파라미터, 스프레드 문법, 객체 스프레드 프로퍼티 (0) | 2021.03.11 |
---|---|
[자바스크립트] 삼항 조건 연산자, 옵셔널체이닝 연산자, null병합 연산자: 변수, 객체, 값의 null 체크 검사 방법 (0) | 2021.03.09 |
[Javascript]문자열(단어)/숫자 최빈값(mode)구하는 방법(+빈도순 정렬) in 배열 (0) | 2021.02.02 |
[Javascript]배열 문자열/숫자 요소 중복제거, 출현횟수(개수) 구하는 방법 (0) | 2021.02.02 |
[Node.js] javascript로 python 연동 호출 오류: Module Not Found Error (0) | 2021.01.29 |
댓글