정규 표현식(Regular Expression) 은 일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어(format language)이다.
// 검색 대상
const target = 'JavaScript';
// 정규 표현식 리터럴 - /pattern/플래그
let regexp = /j/i; // 패턴 : j, 플래그 : i => 대소문자 구별 없이
// RegExp 생성자 함수 - new RegExp(pattern[, flag])
regexp = new RegExp('j', 'i');
regexp = new RegExp(/j/, 'i');
regexp = new RegExp(/j/i); // ES6부터 가능한 표현
// test 메서드 - target 문자열에 대해 정규 표현식 regexp의 패턴을 검색하여 매칭 결과를 불리언으로 반환
console.log(regexp.test(target));
const target = 'Java JavaScript';
RegExp.prototype.exec
: 인수로 전달 받은 문자열에 대해 정규 표현식의 패턴을 검색하여 매칭 결과를 배열로 반환
console.log(/va/.exec(target));
console.log(/va/g.exec(target)); // 문자열 내의 모든 패턴을 검색하는 g 플래그를 지정해도 첫 번째 매칭 결과만 반환
console.log(/hello/.exec(target)); // 매칭 결과가 없을 경우 null 반환
flag의 종류
i(ignore case) : 대소문자 구별 않고 패턴 검색
g(global) : 대상 문자열 내에서 패턴과 일치하는 모든 문자열을 전역 검색
console.log(target.match(/VA/));
console.log(target.match(/VA/i));
console.log(target.match(/VA/ig));
<br>
`pattern`
패턴은 특별한 의미를 가지는 메타문자 또는 기호로 표현할 수 있다.
// . : 임의의 문자열
target = 'abcdefg';
console.log(target.match(/../g)); // 임의의 2자리 문자열 전역 검색
<br>
`{m,n}` : 최소 m번, 최대 n번 반복되는 문자열 (반복 검색)
target = 'a aa aaa b bb bbb ab aab abb';
console.log(target.match(/a{2,3}/g)); // a 최소 2번 ~ 최대 3번 반복
console.log(target.match(/b{2}/g)); // b 두 번 반복
console.log(target.match(/b{3,}/g)); // b 세 번 이상 반복
<br>
`+` : 앞선 패턴이 최소 한 번 이상 반복 되는 문자열 (반복 검색)
// +는 {1,}과 같다.
console.log(target.match(/b+/g));
// ? : 앞선 패턴이 최대 한 번(0번 포함) 이상 반복 되는 문자열 (반복 검색)
// ?는 {0,1}과 같다.
target = 'soul seoul';
console.log(target.match(/se?oul/g));
<br>
`|` : or
target = 'aa bb cc dd 123 456 _@';
console.log(target.match(/a|b/g));
// 분해 되지 않은 단어 레벨로 검색
console.log(target.match(/a+|b+/g));
// [] 내의 문자는 or로 동작
console.log(target.match(/[abc]+/g));
// 범위를 지정하려면 - 사용
console.log(target.match(/[a-z]+/g));
// 대소문자 범위
console.log(target.match(/[A-Za-z]+/g));
// 숫자 범위
console.log(target.match(/[0-9]+/g));
<br>
`\d` : 숫자
// \D : 숫자가 아닌 문자
console.log(target.match(/\d+/g));
console.log(target.match(/\D+/g));
// \w : 알파벳, 숫자, 언더스코어
// \W : \w의 반대
console.log(target.match(/\w+/g));
console.log(target.match(/\W+/g));
<br>
`[..] 내의 ^ `: not
console.log(target.match(/[^0-9]+/g));
console.log(target.match(/[^a-z]+/g));
console.log('--------------------');
<br>
`[..] 밖의 ^` : 시작 위치 검색
<br>
`$` : 마지막 위치 검색
target = 'https://www.google.com';
console.log(/^https/.test(target));
console.log(/com$/.test(target));
<br><br><br>
### 04_example
1. 특정 단어로 시작하는지 검사
// http:// 또는 https:// 로 시작하는지 검사
// const url = 'https://www.google.com';
// const url = 'http://www.google.com';
const url = 'www.google.com';
console.log(/^https?:\/\//.test(url));
2. 특정 단어로 끝나는지 검사
// 파일 확장자가 js인지 검사
// const fileName = 'test.js';
const fileName = 'test.css';
console.log(/js$/.test(fileName));
3. 숫자로만 이루어진 문자열인지 검사
const target = '12345';
// const target = '12345@';
// 처음과 끝이 숫자이고 최소 한 번 이상 반복 되는 문자열과 매칭
console.log(/^\d+$/.test(target));
4. 아이디로 사용 가능한지 검사
// 알파벳 대소문자 또는 숫자로 시작하고 끝나며 6~12자리인지 검사
// const id = 'hello123';
// const id = 'hello';
const id = 'hello안녕';
console.log(/^[A-Za-z\d]{6,12}$/.test(id));
// [가-힣] : 완성 된 자음 모음 형태만 허용
// [ㄱ-ㅎㅏ-ㅣ가-힣] : 자음 모음 완성 된 형태 모두 포함
5. 핸드폰 번호 형식에 맞는지 검사
//const phone = '010-1234-5678';
//const phone = '010-123-5678';
const phone = '010-12345-678';
console.log(/^\d{3}-\d{3,4}-\d{4}$/.test(phone));
6. 특수문자 포함 여부
// const target2 = 'hello#world';
const target2 = 'helloworld';
console.log(/[^A-Za-z0-9가-힣]/.test(target2));