정규 표현식

개발 공부 기록·2021년 8월 1일
0

JavaScript

목록 보기
10/10
post-thumbnail

정규 표현식이란?

정규표현식은 문자열에서 특정한 문자를 찾아내는 도구
=> 특정한 규칙을 갖는 문자열로 이루어진 표현식

정규표현식 사용법

1. 리터럴 패턴

정규표현식 규칙을 슬래시(/)로 감싸 사용
슬래시 안에 들어온 문자열이 찾고자 하는 문자열

let pattern = /c/;

2. 생성자 함수 호출 패턴

RegExp 객체의 생성자 함수를 호출하여 사용

let pattern = new RegExp('c');

정규표현식 내장 메소드

1. RegExp 객체의 메소드

1. exec()

exec 는 execution의 줄임말로, 원하는 정보를 뽑아내고자 할 때 사용

검색의 대상이 찾고자 하는 문자열에 대한 정보를 가지고 있다면 이를 배열로 반환하며, 찾는 문자열이 없다면 null을 반환

let pattern = /c/; 
pattern.exec('coding') // ['c']

2. test()

찾고자 하는 문자열이 대상 안에 있는지의 여부를 boolean 으로 리턴

let pattern = /c/; 
pattern.test('coding') // true

2. String 객체의 메소드

1. match()

RegExp.exec() 와 비슷한 기능을 하며, 정규 표현식을 인자로 받아 주어진 문자열과 일치된 결과를 배열로 반환합니다. 일치되는 결과가 없으면 null 을 리턴

let pattern = /c/;
let str = 'coding';
str.match(pattern); // ['c']

2. replace()

문자열에서 찾고자 하는 대상을 검색해서 이를 치환하려는 문자열로 변경 후 변경된 값을 리턴

let pattern = /c/;
let str = 'coding';
str.replace(pattern, 'C'); // 'Coding'

3. split()

주어진 인자를 구분자로 삼아, 문자열을 부분 문자열로 나누어 그 결과를 배열로 반환

정규표현식을 인자로 받아 가장 처음 매칭되는 부분 문자열의 위치를 반환 / 매칭되는 문자열이 없으면 -1을 반환

"JavaScript".search(/script/); // -1 대소문자를 구분
"JavaScript".search(/Script/); // 4
"coding".search(/odi/); // 1

flag

정규표현식은 플래그를 설정해 줄 수 있으며, 플래그는 추가적인 검색 옵션의 역할

플래그들은 각자 혹은 함께 사용하는 것이 모두 가능하며, 순서에 구분이 없다

1. i

i를 붙이면 대소문자를 구분하지 않는다.

let withi = /c/i;
let withouti = /c/;
"Coding".match(withi); // ['C']
"Coding".match(withouti); // null

2. g

global의 약자로, g를 붙이면 검색된 모든 결과를 리턴

let withg = /c/g;
let withoutg = /c/;
"coolcoding".match(withg); // ['c', 'c']
"coolcoding".match(withoutg); // ['c'] g 가 없으면 첫 번째 검색 결과만 반환

3. m

m을 붙이면 다중행을 검색

let str = `1st : cool
2nd : cod
3rd : ing`;
str.match(/c/gm)
// 3개의 행을 검색하여 모든 c 를 반환
// ['c', 'c']
str.match(/c/m)
// m은 다중행을 검색하게 해 주지만, g 를 빼고 검색하면 검색 대상을 찾는 순간 검색을 멈추기 때문에
// 첫 행의 ['c'] 만 리턴

정규식 패턴(표현식)

정규식 패턴설명
^줄(Line)의 시작에서 일치 /^abc/
$줄(Line)의 끝에서 일치 /xyz$/
.(특수기호, 띄어쓰기를 포함한) 임의의 한 문자
a(bar)ba or b 와 일치, 인덱스가 작은 것을 우선 반환
*0회 이상 연속으로 반복되는 문자와 가능한 많이 일치. {0,} 와 동일
*?0회 이상 연속으로 반복되는 문자와 가능한 적게 일치. {0} 와 동일
+1회 이상 연속으로 반복되는 문자와 가능한 많이 일치. {1,} 와 동일
+?1회 이상 연속으로 반복되는 문자와 가능한 적게 일치. {0} 와 동일
{3}숫자 3개 연속 일치
{3,}3개 이상 연속 일치
{3, 5}3개 이상 5개 이하 연속 일치
()캡쳐(capture)할 그룹
[a-z]a부터 z 사이의 문자 구간에 일치(영어 소문자)
[A-Z]A부터 Z 사이의 문자 구간에 일치(영어 대문자)
[0-9]0부터 9 사이의 문자 구간에 일치(숫자)
\(역슬래쉬)escape 문자. 특수 기호 앞에 \를 붙이면 정규식 패턴이 아닌, 기호 자체로 인식
\d숫자를 검색함. /[0-9]/와 동일
\D숫자가 아닌 문자를 검색함. /[^0-9]/와 동일
\w영어대소문자, 숫자, (underscore)를 검색함. /[A-Za-z0-9]/ 와 동일
\W영어대소문자, 숫자, (underscore)가 아닌 문자를 검색함. /[^A-Za-z0-9]/ 와 동일
[^][]안의 문자열 앞에 ^이 쓰이면, []안에 없는 문자를 검색함

문법 정리

Groups and ranges

Chracter
bar(or 연산자)또는
( )그룹
[ ]문자셋, 괄호안의 어떤 문자든
[^]부정 문자셋, 괄호안의 어떤 문가 아닐때
(?:)찾지만 기억하지는 않음

Quantifiers

Chracter
?없거나 있거나 (zero or one)
*없거나 있거나 많거나 (zero or more)
+하나 또는 많이 (one or more)
{n}n번 반복
{min,}최소
{min,max}최소, 그리고 최대

Boundary-type

Chracter
\b단어 경계
\B단어 경계가 아님
^문장의 시작
$문장의 끝

Character classes

Chracter
\ 특수 문자가 아닌 문자
.어떤 글자 (줄바꿈 문자 제외)
\ddigit 숫자
\Ddigit 숫자 아님
\wword 문자
\Wword 문자 아님
\sspace 공백
\Sspace 공백 아님

정규표현식을 활용한 유효성 검사

이메일 유효성 검사

let regExp = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;

휴대전화 번호 유효성 검사

let regExp = /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/;
profile
둔필승총(鈍筆勝聰) - 기억보다는 기록을

0개의 댓글