정규 표현식이란?
•
일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어
•
문자열 대상으로 패턴 매칭 기능 제공 --> 특정 패턴과 일치하는 문자열을 검색하거나 추출 또는 치환할 수 있게 해줌
•
정규표현식은 주석이나 공백을 허용하지 않고 여러 가지 기호를 혼합하여 사용해서 가독성이 좋지 않음.
정규 표현식의 생성
•
일반적인 정규 표현식 생성 방법은 정규 표현식 리터럴을 사용하는 것
•
정규표현식 리터럴은 패턴과 플래그로 구성
const target = 'Is this all there is?';
// 패턴: is
// 플래그: i => 대소문자를 구별하지 않고 검색
const regexp = /is/i;
// test 메서드는 target 문자열에 대해 정규 표현식 regexp의 패턴을 검색하여
// 매칭 결과를 불리언 값으로 반환
regexp.test(target); // -> true
// 생성자 함수
const regexp2 = new RegExp(/is/i);
TypeScript
복사
생성자 함수를 사용하여 RegExp 객체를 생성 가능
RegExp 메서드
RegExp.prototype.exec
•
정규 표현식의 패턴을 검색하여 매칭 결과를 배열로 반환
•
매칭 결과가 없는 경우 null을 반환
•
모든 패턴을 검색하는 g 플래그 설정해도 첫 번째 매칭 결과만 반환
RegExp.prototype.test
•
정규 표현식의 패턴을 검색하여 매칭 결과를 불리언 값으로 반환
String.prototype.match
•
String 표준 빌트인 객체가 제공하는 match 메서드
•
대상 문자열과 인수로 전달받은 정규 표현식과의 매칭 결과를 배열로 반환
const target = 'Is this all there is?';
const regExp = /is/g;
target.match(regExp); // -> ["is", "is"]
const target = 'Is this all there is?';
// target 문자열에서 is 문자열을 대소문자를 구별하여 한 번만 검색
target.match(/is/);
// -> ["is", index: 5, input: "Is this all there is?", groups: undefined]
// target 문자열에서 is 문자열을 대소문자를 구별하지 않고 한 번만 검색
target.match(/is/i);
// -> ["Is", index: 0, input: "Is this all there is?", groups: undefined]
// target 문자열에서 is 문자열을 대소문자를 구별하여 전역 검색
target.match(/is/g);
// -> ["is", "is"]
// target 문자열에서 is 문자열을 대소문자를 구별하지 않고 전역 검색
target.match(/is/ig);
// -> ["Is", "is", "is"]
TypeScript
복사
exec 메서드의 경우 g 플래그를 지정해도 첫 번재 매칭 결과만 반환하지만, 이 메서드의 경우 g 플래그 지정 시, 모든 매칭 결과를 반환
플래그
플래그 | 의미 | 설명 |
i | ignore case | 대소문자 구별하지 않고 패턴 검색 |
g | global | 대상 문자열 내에서 패턴과 일치하는 모든 문자열 전역 검색 |
m | multi line | 문자열의 행이 바뀌더라도 패턴 검색 계속함 |
•
정규 표현식의 검색 방식을 설정하기 위해 사용
•
순서와 상관없이 하나 이상의 플래그를 동시에 설정 가능하고 플래그를 사용하지 않은 경우 대소문자 구별해서 패턴 검색
•
패턴 검색 매칭 대상이 1개이상 존재해도 첫 번째 매칭한 대상만 검색하고 종료
패턴
•
정규 표현식의 패턴 : 문자열의 일정한 규칙을 표현하기 위해 사용
•
문자열의 따옴표는 보통 생략하며 포함시, 따옴표까지도 패턴에 포함되어 검색됨.
•
패턴은 특별한 의미를 가지는 메타문자 또는 기호로 표현이 가능
•
어떤 문자열 내에 패턴과 일치하는 문자열이 존재할 때 '정규 표현식과 매치한다'고 표현
문자열 검색
•
정규 표현식의 패턴에 문자 또는 문자열을 지정하면 검색 대상 문자열에서 패턴으로 지정한 문자 또는 문자열을 검색
•
-> 메서드를 사용하여 매칭 결과를 구하면 검색 수행 (exec or test or match 메서드)
임의의 문자열 검색
•
.은 임의의 문자 한 개를 의미 --> 문자의 내용이 무엇이든 상관없음 (빈 문자열도 포함)
const target = 'Is this all there is?';
// 임의의 3자리 문자열을 대소문자를 구별하여 전역 검색한다.
const regExp = /.../g;
target.match(regExp); // -> ["Is ", "thi", "s a", "ll ", "the", "re ", "is?"]
TypeScript
복사
반복 검색
•
{m,n} 은 앞선 패턴이 최소 m번, 최대 n번 반복되는 문자열을 의미
A{m,n} // A가 최소 m번, 최대 n번 반복되는 문자열 찾아라
A{n} // A가 n번 반복되는 문자열 찾아라
A{n,} // A가 최소 n번 이상 반복되는 문자열 찾아라
A+ // A가 최소 1번 이상 반복되는 문자열
u? // ? 는 ?앞의 문자'u'가 최대 한 번이상 반복되는 문자열 찾아라 --> {0,1}과 같다.
TypeScript
복사
OR 검색
•
| --> or의 의미 보유
•
/A|B/ --> A 또는 B를 의미
•
이를 간단히 표현하면 []를 사용 --? /[AB]+/g (A또는 B가 한 번 이상 반복되는 문자열 전역 검색)
•
범위를 지정하려면 [] 내에 - 를 사용
// 'A'~'Z' 또는 'a'~'z'가 한 번 이상 반복되는 문자열 전역 검색
const regExp = /[A-za-z]+/g;
// '0' ~ '9'가 한 번 이상 반복되는 문자열 전역 검색
const regExp2 = /[0-9]+/g;
[\d] --> 모든 숫자
[\D] --> 숫자가 아닌 문자
[\w] --> 알파벳, 숫자, 언더스코어
[\W] --> 알파벳, 숫자, 언더스코어가 아닌 문자
TypeScript
복사
NOT 검색
•
[...] 안에서 ^을 사용하여 not을 사용
시작 위치로 검색
•
[...] 밖에서 사용하면 문자열의 시작을 의미
const regExp = /^https/; // 'https'로 시작하는 지?
TypeScript
복사
마지막 위치로 검색
•
$는 문자열의 마지막을 의미
const regExp = /com$/; // 'https'로 시작하는 지?
TypeScript
복사
자주 사용하는 정규표현식
특정 단어로 시작하는지 검사
const url = 'https://example.com';
/^https?:\/\//.test(url); // --> true
TypeScript
복사
특정 단어로 끝나는지 검사
const fileName = 'index.html';
// 'html'로 끝나는지 검사한다.
/html$/.test(fileName); // -->true;
TypeScript
복사
숫자로만 이루어진 문자열인지 검사
•
^ : 문자열의 시작
•
$ : 문자열의 마지막
•
\d : 숫자
•
+ : 앞선 패턴이 최소 한 번 이상 반복되는 문자열
const target = '12345';
/^\d+$/.test(target); // --> true
TypeScript
복사
하나 이상의 공백으로 시작하는지 검사
const target = ' Hi!';
// 하나 이상 공백으로 시작하는지 검사
/^[\s]+/test(target); // -> true;
TypeScript
복사
아이디로 사용 가능한지 검사
•
알파벳 대소문자 또는 숫자로 시작하고 끝나며 4~10자리인지 검사
const id = 'abc123';
/^[A-Za-z0-9]{4,10}$/.test(id); // -> true
TypeScript
복사
메일 주소 형식에 맞는지 검사
const email = 'jeongmin2@gmail.com';
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/.test(email); --> true
TypeScript
복사
핸드폰 번호 형식에 맞는지 검사
const cellphone = '010-1234-5678';
/^\d{3}-\d{3,4}-\d{4}$/.test(cellphone); // --> true
TypeScript
복사
특수 문자 포함 여부 검사
•
특수문자는 A-Za-z0-9 이외의 문자이기 때문에 true
const target = 'abc#123';
(/[^A-Za-z0-9]/gi).test(target); // -> true
TypeScript
복사
•
특수 문자 제거 --> String.prototype.replace 메서드 사용
target.replace(/[^A-Za-z0-9]/gi, ''); // -> abc123
TypeScript
복사