
패턴을 이용하여 문자 검색, 대체, 추출 등을 수행 가능한 문법이다.
성능은 매우 느리나, 엄청 편리하기 때문에 짧은 문자열에서는 효율이 좋다.
정규표현식 표현법
/regexr/i시작기호, 패턴, 종료기호, 플래그(Flag)로 이루어져 있다
01X-XXX(X)-XXXX
휴대폰 번호는 위와 같이
세 자리 숫자, 하이픈, 셋 혹은 네 자리 숫자, 하이픈, 네 자리 숫자 패턴을 가진다.

\d : 모든 숫자
d{n} : n개의 숫자
d{n,k} : n개 이상 k개 이하 숫자
따라서 /\d{3}-\d{3,4}-\d{4}/ 로 휴대폰 번호를 찾을 수 있다.
harry@naver.com
porter@gmail.com
위 이메일 주소에서 naver와 gamil만 뽑고 싶다.
이메일은 문자열, @, 문자열, ., 문자열 패턴을 가진다.

. : 모든 문자열
.+ : 한 개 이상의 문자열
() : 캡쳐 (그룹화), 해당 괄호 내 문자만 필터
따라서 /.+@(.+)\..+/로 특정 문자열을 찾을 수 있다.
/(.+)@(.+)\..+/로는 harry, porter 까지 원하는대로 찾을 수 있다.
RegExp 객체로 정규표현식 기능을 제공한다.
Array, Object처럼 리터럴로 생성 가능하다.
const regExp1 = new RegExp('^\\d{2}'); // new RegExp 객체 생성자 함수
const regExp2 = new RegExp('^\\d{3, 4}', 'i'); // 표현식, 플래그
const regExp3 = /^d{2}/; // 리터럴 방식
const regExp4 = /^d{3, 4}/i; // 표현식, 플래그
입력받은 문자열에 찾는 패턴이 있는지 찾아서 있다면 true, 없으면 false를 반환
const message = '문의사항은 010-1234-5678로 연락바랍니다.';
const message2 = '배드민턴 치고 싶어요!!';
const regExp = new RegExp('\\d{3}-\\d{3,4}-\\d{4}');
const regExp2 = /\d{3}-\d{3,4}-\d{4}/;
console.log(regExp.test(message)); // true
console.log(regExp2.test(message)); // true
console.log(regExp.test(message2)); // false
console.log(regExp2.test(message2)); // false
입력받은 문자열에 찾는 패턴을 확인 후 있다면 일치한 패턴 정보를 반환, 없으면 null 반환
const message = '문의사항은 010-1234-5678로 연락바랍니다.';
const message2 = '배드민턴 치고 싶어요!!';
const regExp = new RegExp('\\d{3}-\\d{3,4}-\\d{4}');
const regExp2 = /\d{3}-\d{3,4}-\d{4}/;
console.log(regExp.exec(message));
console.log(regExp2.exec(message));
console.log(regExp.exec(message2));
console.log(regExp2.exec(message2));

String 객체의 match 함수는 exec 함수와 동일함
matchAll 함수는 패턴이 일치하는 모든 문자 정보를 추출
const message = '문의사항은 010-1234-5678로 연락바랍니다.';
const message2 = `문의사항은 010-1234-5678 또는
010-0000-0000으로 연락바랍니다.`;
const regExp = /\d{3}-\d{3,4}-\d{4}/;
console.log(message.match(regExp));
console.log(message2.match(regExp));
console.log([...message2.matchAll(/\d{3}-\d{3,4}-\d{4}/g)]);

일치하는 패턴 정보를 원하는 문자열로 바꿔준다.
자주 사용되는 문자 대체 함수이다.
const message = '문의사항은 010-1234-5678로 연락바랍니다.';
const message2 = `문의사항은 010-1234-5678 또는
010-0000-0000으로 연락바랍니다.`;
const regExp = /\d{3}-\d{3,4}-\d{4}/;
console.log(message.replace(regExp, '휴대폰번호'));
console.log(message2.replace(regExp, '휴대폰번호'));
console.log(message2.replace(/\d{3}-\d{3,4}-\d{4}/g, '휴대폰번호'));

일치한 패턴 정보의 위치를 반환한다. 문자 검색에 해당한다.
const message = '문의사항은 010-1234-5678로 연락바랍니다.';
const message2 = `문의사항은 010-1234-5678 또는
010-0000-0000으로 연락바랍니다.`;
const regExp = /\d{3}-\d{3,4}-\d{4}/;
console.log(message.search(regExp));
console.log(message2.search(regExp));
// 무조건 처음 매칭된 것을 추출한다.
console.log(message2.search(/\d{3}-\d{3,4}-\d{4}/g));
// 모두 추출하려면 matchAll을 사용한다.
console.log([...message2.matchAll(/\d{3}-\d{3,4}-\d{4}/g)]);

캡처가 적용된 정규표현식을 이용하면 match 반환값의
첫 번째 인덱스부터 순차적으로 캡처 결과를 출력
const message = '문의사항은 010-1234-5678로 연락바랍니다.';
const regExp = /(\d{3})-(\d{3,4})-(\d{4})/;
console.log(message.match(regExp));

매우 간단한 비손실 압축 방법
"AAABBCCCC" 문자열을 압축하려면 "3A2B4C"로 압축 가능하다.

\1 : 첫 번째 캡처를 이용
const raw = 'AAABBCCCC';
const answer = '3A2B4C';
const regExp = /(.)\1*/g;
const result = raw
.match(regExp)
.reduce((a, b) => a + `${b.length}${b.slice(0, 1)}`, '');
console.log(result);
console.log(result === answer);
정규표현식과 match를 통해 일치하는 문자를 모두 찾고 이것을 reduce를 통해 추출하여 압축한다.
😅 해당 내용은 공부하면서 정리한 글입니다. 틀린 부분이나 오해하고 있는 부분이 있다면 피드백 부탁드립니다.
내 풀이
let ln = '1';
function antFunc(n) {
const regExp = /(.)\1*/g; // 정규표현식
// n번 수행 후 출력
if (n === 1) {
console.log(ln);
return;
}
// Run-length encoding
ln = ln.match(regExp).reduce((a, b) => a + `${b.length}${b.slice(0, 1)}`, '');
antFunc(n - 1); // 재귀
}
antFunc(5); // 111221
재귀 함수를 사용해 정규표현식을 5번 반복하여 개미수열을 구현했다.