[JavaScript] 정규표현식(RegExp)공부방2023. 1. 17. 14:33
Table of Contents
728x90
728x90
정규표현식(RegExp)
정규표현식이란 특정 문자 조합을 찾기 위한 패턴이며, 이 패턴을 이용해 텍스트를 판별할 때 사용한다.
사용하는 이유
회원 가입 등 사용자가 입력해야 하는 상황에 사용자가 어떤 값을 입력 해야할 지 예측할 수 없을 때 하나하나 조건문, 반복문을 사용하면 너무 많은 코드를 사용하게 된다. 그 때 정규 표현식을 사용한다면 짧은 코드로 수월하게 처리할 수 있다.
생성방법
생성자 함수 생성방식
바뀔 수 있는 패턴이나, 사용자 입력 등 외부 출처에서 가져오는 패턴의 경우 사용하는 것이 좋다.
new RegExp('[a-z]', 'gi');
생성자 함수를 사용할 경우 보통의 문자열 이스케이프 규칙을 준수해야 한다.
이스케이프 규칙
특수 문자를 문자열에 사용할 때 앞에 역빗금(\)을 붙인다.
리터럴 방식
슬래시로 패턴을 감싸 작성스크립트를 불러올 때 컴파일된다.
바뀔 일이 없는 패턴의 경우 리터럴 방식을 사용하면 성능이 향상된다.//
const RegExp = /abcd+efg/
패턴
패턴 구분자 ( / )
패턴을 구분하는 문자이다.
메타문자
정규 표현식에서 일정한 의미를 가지고 사용되는 특수문자이다.
메타문자의 분류에 따른 종류는 https://zephyrus1111.tistory.com/310에 자세히 서술되어있다.
어서션
줄이나 단어의 시작과 끝을 나타내는 경계와 일치가 가능한 방법을 찾아내는 패턴
종류 | 기능 |
^ | 문자열의 시작에 일치하는 문자 |
$ | 문자열의 마지막에 있는 문자 |
\b | 단어의 경계에 대응 |
\B | 단어의 경계가 아닌 부분에 대응 |
문자클래스(en-US)
문자를 구별한다
종류 | 기능 |
. | 임의의 한 문자를 의미하며 모든 문자 선택 |
\d | 숫자[0-9] |
\D | 문자 |
\w | 밑줄 포함 영,숫자 |
\W | 단어 문자가 아닌 문자 |
\s | 공백 문자 |
\S | 공백 문자가 아닌 하나의 문자 대응 |
\t | 탭 문자 |
\v | 수직 탭 문자 |
그룹과 범위
표현 문자의 그룹과 범위를 나타냄
종류 | 기능 |
| | or을 의미 |
[ ] | 문자 그룹 |
\n | 줄바꿈 문자 |
(x) | 포획 괄호 문자열을 묶어준다 |
(?:x) | 비포획 괄호 문자열 전체에 동작할 수 있게 하고 싶을 때 |
x(?=y) | x중에서 y가 뒤따라오는 x |
x(?!y) | x중에서 y가 뒤따라오지 않는 x |
수량자
일치시킬 문자 또는 표현식의 수
종류 | 기능 |
? | ?의 앞 문자가 없거나 하나 있음 |
+ | +앞의 문자가 하나 이상 반복됨 |
* | * 앞의 문자가 0개 이상 반복됨 |
*? | 앞 문자열이 0번이상 반복되는지를 확인하며 가능한 적게 일치하는 값을 찾는다. |
+? | 앞 문자열이 1번이상 반복되는지를 확인하며 가능한 적게 일치하는 값을 찾는다. |
{n} | {n}의 앞 문자가 n개 있음 |
{n,} | {n}의 앞 문자가 n개 이상 |
{n,m} | 앞 문자가 n개이상 m개이하로 있다 |
메서드
종류 | 기능 |
test() | 문자열이 정규표현식과 매칭되면 true, 아니면 false |
match() | 문자열에서 정규표현식에 매칭되는 모든 항목들을 배열로 반환 |
exec() | match와 유사하지만 첫 번째 매칭결과만 반환 |
replace() | 문자열에서 일치하는 문자를 다른 문자로 대체 |
replaceAll() | 문자열에서 일치하는 부분을 모두 탐색 후 모두 대체 문자열로 바꾼다. |
search() | 문자열에서 찾고자 하는 문장의 인덱스 값 |
split() | 문자열을 정규표현식에 매칭되는 항목으로 split |
예시
개별 숫자 - /[0-9]/g
전체에서 0~9사이에 아무 숫자 '하나' 찾음
개별 문자 - /[to]/g
전체에서 t 혹은 o 를 모두 찾음
단어 - /filter/g
전체에서 f 따로 i 따로 찾는게 아니라 'filter' 라는 단어에 매칭되는것을 찾음
단어 제외 - /\b(?:(?!to)\w)+\b/g
전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 / 확인결과 "Tutorial" 도 제외됨.
단어 제외 - \b(?!\bto\b)\w+\b
전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 / 확인결과 "Tutorial" 는 제외 안됨. 이게 더 정확하다고 볼수있을듯.
이메일 - /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
'시작을' 0~9 사이 숫자 or a-z A-Z 알바펫 아무거나로 시작하고 /
중간에 - _ . 같은 문자가 있을수도 있고 없을수도 있으며 /
그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며 /
@ 가 반드시 존재하고 /
0-9a-zA-Z 여기서 하나가 있고 /
중간에 - _ . 같은 문자가 있을수도 있고 없을수도 있으며 /
그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며 /
반드시 . 이 존재하고 /
[a-zA-Z] 의 문자가 2개나 3개가 존재 /
이 모든것은 대소문자 구분안함
핸드폰 번호 - /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/
시작을 숫자 01로 시작하며 그 후에 0,1,6,7,8,9 중에 하나가 나올수도 있으며 /
하이픈 - 하나 존재할수도 있으며 /
숫자 3~4개 이어지고 /
또 하이픈 - 하나 존재할수도 있으며 /
숫자 4개가 이어짐
728x90
300x250
@mag1c :: 꾸준히 재밌게
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!