[JavaScript] 정규 표현식 (Regular Expression)

배똥회장·2022년 8월 23일

📝 기본 설명

정규 표현식을 줄여서 정규식이라고 하기도 함

📌 실무 속 정규 표현식

사용자로부터 입력받은 데이터가 프로그램에서 받고자 하는 데이터 형시고가 일치하는지 체크할 때 주로 사용

  • 사용자가 입력한 이메일 정보가 이메일 형식에 맞는지
  • 전화번호가 전화번호 형식에 맞는지

📝 정규식 만드는 방법

📌 정규식 리터럴을 사용

정규식 리터럴은 슬래시(/)로 감싸는 패턴임

const regexp = /World/;

📌 RegExp 객체

생성자 함수를 사용하면 정규식이 실행 시점에 컴파일됨
정규식 패턴을 동적으로 적용해야 하는 경우 주로 사용

const regexp = new RegExp("World");

📝 정규식 함수

정규식에서 제공하는 내장 함수

📌 exec

정규식을 통해 찾고자 하는 문자열 패턴을 찾고 배열을 반환함.
대응되는 문자열을 찾지 못하면 null을 반환

📌 test

대응되는 문자열이 있는지 검사하고 있으면 true, 없으면 false를 반환

📌 match

대응되는 문자열을 찾아 배열로 반환하는 String 객체 내장 함수
대응되는 문자열이 없으면 null을 반환
exec 함수와 동일한 기능

대응되는 문자열이 있는지 검사하고, 대응되는 첫 번째 문자열의 인덱스를 반환
대응되는 문자열이 없으면 -1을 반환

📌 replace

대응되는 문자열을 찾아 다른 문자열로 치환하는 String 객체 내장 함수

📌 split

대응되는 문자열을 찾고, 찾은 문자열을 기준으로 나누어서 배열로 반환하는 String 객체 내장 함수


📝 정규식 특수 문자

📌 \ (백슬래시)

정규식 특수 문자 중 특수 문자로써 동작하는 것이 아니라 문자 그대로 일반 문자로 인식되어야 하는 경우 특수 문자 앞에 백슬래시를 사용하여 일반 문자로 인식시키는 것

📌 ^

입력의 시작 부분에 대응
ex) /^A/의 경우 문자열의 시작이 "A"로 시작하냐는 것을 파악

📌 $

입력의 끝 부분에 대응
ex) /t$/의 경우 문자열의 끝이 "t"로 끝나냐는 것을 파악

📌 *

특수 문자 * 앞의 표현식이 0회 이상 반복되는 부분과 대응
ex) /bo*/는 문자열에 "b"를 포함하고, "b" 다음 문자로 "o"가 있을 수도 있고, 없을 수도 있다는 의미

📌 +

특수 문자 + 앞의 표현식이 1회 이상 반복되는 부분과 대응
ex) /bo+/는 문자열에 "b"를 표함하고 "b" 다음 문자로 "o"가 1회 이상 있어야 한다는 의미

📌 ?

특수 문자 ? 앞의 표현식이 0 또는 1회 등장하는 부분과 대응
ex) /e?le?/는 e가 없어도 되고 있다면 1회를 의미하기 때문에 "l", "el", "ele", "le"를 포함하고 있는지와 대응

📌 .

단일 문자에 대응
ex) /.n/는 "an apple"에서 "an에 대응

📌 (x)

괄호는 포획 괄호(capturing parentheses)라 부름 괄호 안에 패턴 전체에 적용
ex) /foo{1,2}/는 마지막 "o"에만 {1, 2}가 적용되어 "o"가 최소 한 번, 최대 2번 나타나는 것에 대응
/(foo){1,2}/는 "foo" 전체에 {1,2}가 적용되어 "foo"가 최소 한 번, 최대 2번 나태나는 것에 대응

📌 (?:x)

사용법은 (x)와 동일하지만, 대응되는 결과를 기억하지 않음

📌 x(?=y)

x 뒤에 y가 따라오는 경우에만 대응하며 lokahead라고 부름
ex) /\d+(?=g)/는 숫자 뒤에 "g"가 뒤따라오는 경우에만 대응

📌 x(?!y)

x 뒤에 y가 없는 경우에만 대응하며 negative lookahead라고 부름

📌 x|y

x 또는 y에 대응됨
ex) /green|red/는 문자열에 "green" 혹은 "red"가 포함되었는지에 대응

📌 {n}

앞 표현식이 n번 나타나는 부분에 대응. n은 반드시 양의 정수임
ex) /e{2}/는 e가 2번 나타나는 부분에만 대응하며 n보다 더 들어 있어도 처음 나타나는 "ee"에만 대응

📌 {n, m}

n과 m은 양의 정수이고, n <= m을 만족해야 함.
앞 표현식이 최소 n개, 최대 m개가 나타나는 부분에 대응됨

📌 [xyz]

문자셋으로 하이픈을 사용해서 문자의 범위를 지정할 수 있음
ex) [a-d]는 [abcd]와 똑같이 동작하며 문자열에 "a", "b", "c", "d" 중 하나라도 있으면 대응

📌 [^xyz]

부정 문자셋으로 패턴에 포함된 문자가 없는지와 대응. 하이픈을 사용하여 문자의 범위를 지정할 수 있음
ex) [^a-d]는 문자열에 "a", "b", "c", "d" 모두 없는지와 대응

📌 [\b]

백스페이스에 대응됨. 백스페이스 문자에 대응시키려면 대괄호([])를 사용해야 함

📌 \b

문자열에 있는 단어의 경계, 즉 첫 문자와 종료 문자에 대응
ex) /\bm/은 문자열의 단어 중 "m"으로 시작하는 단어에 대응하며, /m\b/는 문자열의 단어 중 "m"으로 끝나는 단어에 대응

📌 \B

단어 경계가 아닌 부분에 대응

📌 \d

숫자 문자에 대응 [0-9]와 동일

📌 \D

숫자 문자가 아닌 문자에 대응. [^0-9]와 동일

📌 \f

폼피드(U+000C) 문자에 대응

📌 \n

줄 바꿈(U+000A) 문자에 대응

📌 \r

엔터 키에 해당하는 문자에 대응

📌 \s

하나의 공백 문자에 대응

📌 \S

공백 문자가 아닌 문자에 대응

📌 \t

탭(U+0009) 문자에 대응

📌 \v

수직 탭(U+000B) 문자에 대응

📌 \w

밑줄 문자를 포함한 숫자, 영문 문자에 대응
[A-Za-z0-9_]와 동일. 즉, "_, A~Z, a~z, 0~9 와 동일

📌 \W

밑줄 문자, 숫자, 영문 문자가 아닌 문자에 대응
[^A-Za-z0-9_]와 동일

📌 /n

새로운 줄(new line)에 대응

📌 \0

널(U+0000) 문자에 대응

📌 \xhh

16진수 hh에 대응

📌 \uhhh

유니코드 문자 16진수 hhh에 대응


📝 정규식 플래그

전역 검색, 대소문자 구분 없는 검색을 수행할 수 있음

📌 g

전역 검색 - 대응되는 문자 전부 검색

📌 i

대소문자 구분 없는 검색

📌 m

다중 행 검색


📝 사용되는 사례

📌 핸드폰 번호가 올바른 형식인지를 체크하는 정규식

const regexp_mobile = /^(010)-\d{4}-\d{4}$/;

//반드시 010으로 시작하고, 그 다음 하이픈(-), 숫자 4자리, 하이픈(-), 숫자 4자리가 차례대로 입력된 형식

console.log(regexp_mobile.test("010-3124-1234"));

📌 이메일 주소가 올바른 형식인지 체크하는 정규식

const regexp_email = /^([a-z]+\d*)+(\.?\w+)+@\w+(\.\w{2,3})+$/;
//반드시 알파벳 소문자로 시작하고 숫자는 0회 이상 패턴이 1번 이상 있고, 
//점(.)은 있거나 1번만 사용할 수 있고, 
//뒤에 하나 이상의 문자가 오고, 
//@는 반드시 @가 있고, 
//하나 이상의 문자가 오고, 
//점(.)과 2~3개의 문자가 1회 이상 반복되어 종료한다는 것을 의미

console.log(regexp_email.test("jeremy2021.go@gamil.com"));
profile
어쩌면 개발자

0개의 댓글