정규표현식

Jun 2k (Jun2)·2023년 9월 21일

JavaScript

목록 보기
5/5
post-thumbnail

정규표현식

패턴을 이용하여 문자 검색, 대체, 추출 등을 수행 가능한 문법이다.
성능은 매우 느리나, 엄청 편리하기 때문에 짧은 문자열에서는 효율이 좋다.

  • 정규표현식 테스트 사이트 https://rubular.com/
    여러 패턴에 대한 레퍼런스 제공, 테스트 가능

정규표현식 표현법


/regexr/i 시작기호, 패턴, 종료기호, 플래그(Flag)로 이루어져 있다


정규표현식 실습 예시

1. 휴대폰 번호 찾기

01X-XXX(X)-XXXX
휴대폰 번호는 위와 같이
세 자리 숫자, 하이픈, 셋 혹은 네 자리 숫자, 하이픈, 네 자리 숫자 패턴을 가진다.

\d : 모든 숫자
d{n} : n개의 숫자
d{n,k} : n개 이상 k개 이하 숫자

따라서 /\d{3}-\d{3,4}-\d{4}/ 로 휴대폰 번호를 찾을 수 있다.


2. 이메일 주소에서 특정 문자열만 뽑기

harry@naver.com
porter@gmail.com
위 이메일 주소에서 naver와 gamil만 뽑고 싶다.
이메일은 문자열, @, 문자열, ., 문자열 패턴을 가진다.

. : 모든 문자열
.+ : 한 개 이상의 문자열
() : 캡쳐 (그룹화), 해당 괄호 내 문자만 필터

따라서 /.+@(.+)\..+/로 특정 문자열을 찾을 수 있다.
/(.+)@(.+)\..+/로는 harry, porter 까지 원하는대로 찾을 수 있다.


정규표현식 관련 사이트

정규표현식을 간단한 예제를 통해 학습할 수 있는 사이트

https://regexone.com/


정규표현식 골프 게임 사이트

https://alf.nu/RegexGolf


JavaScript에서의 정규표현식

생성 방법

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; // 표현식, 플래그

정규표현식 여러 기능

test

입력받은 문자열에 찾는 패턴이 있는지 찾아서 있다면 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

exec

입력받은 문자열에 찾는 패턴을 확인 후 있다면 일치한 패턴 정보를 반환, 없으면 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));


match

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)]);


replace

일치하는 패턴 정보를 원하는 문자열로 바꿔준다.
자주 사용되는 문자 대체 함수이다.

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)]);


capture

캡처가 적용된 정규표현식을 이용하면 match 반환값의
첫 번째 인덱스부터 순차적으로 캡처 결과를 출력

const message = '문의사항은 010-1234-5678로 연락바랍니다.';

const regExp = /(\d{3})-(\d{3,4})-(\d{4})/;
console.log(message.match(regExp));


Run-length encoding

매우 간단한 비손실 압축 방법
"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를 통해 추출하여 압축한다.



😅 해당 내용은 공부하면서 정리한 글입니다. 틀린 부분이나 오해하고 있는 부분이 있다면 피드백 부탁드립니다.

선택과제

  • 개미수열을 정규표현식으로 이용하여 풀기
  • 5를 입력받으면 "111221"이 나와야 한다.

내 풀이

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번 반복하여 개미수열을 구현했다.

profile
유리프트 프론트엔드

0개의 댓글