코딩 이론

정규표현식

lap_mu 2023. 5. 4. 18:53

이번에도 프로그래머스 문제이다. 문자열이 주어지는데 숫자로만 이루어져 있나 판별하는 문제였다. 여기서 정규표현식을 사용하여 숫자를 모두 제거하고 빈 문자열인지 아닌지 판별하여 결과를 도출하려했다. (https://school.programmers.co.kr/learn/courses/30/lessons/12918)


정규표현식

  • 문자열에서 특정 문자 조합을 찾기 위해 사용
  • 텍스트 검색 및 바꾸기, 데이터 유효성 검사, 텍스트 파일 구문 분석과 같은 작업할 때 사용
  • 기호를 사용하여 암호처럼 생기다보니 가독성이 떨어짐

 

생성

// 정규 표현식 리터럴
const re = /ab+c/

// 정규 표현식 생성자 함수
const re = new RegExp('ab+c')
  • 정규 표현식 리터럴
    •  슬래시로 패턴을 감싸서 작성
    • 스크립트를 불러올 때 컴파일
    • 패턴이 바뀌지 않을 경우 리터럴을 사용하면 성능이 향상 될 수 있다. 
  • 생성자 함수
    • new RegExp('패턴') 으로 생성
    • 런타임 시 컴파일
    • 패턴이 바뀌거나 사용자의 입력 등 외부 출처에서 패턴을 가져올 경우 사용한다

 

패턴

// Assertions
const text = 'A quick fox';

const regexpLastWord = /\w+$/;
console.log(text.match(regexpLastWord)); // Array ["fox"]

// Character classes
const chessStory = 'He played the King in a8 and she moved her Queen in c2.';

const regexpCoordinates = /\w\d/g;
console.log(chessStory.match(regexpCoordinates)); // Array [ 'a8', 'c2']

// Groups and Ranges
const aliceExcerpt = 'The Caterpillar and Alice looked at each other';

const regexpWithoutE = /\b[a-df-z]+\b/ig;
console.log(aliceExcerpt.match(regexpWithoutE)); // Array ["and", "at"]

// Quantifiers
const ghostSpeak = 'booh boooooooh';

const regexpSpooky = /bo{3,}h/;
console.log(ghostSpeak.match(regexpSpooky)); // Array ["boooooooh"]

// Unicode property escapes
const sentence = 'A ticket costs 2000 👌.';

const regexpEmojiPresentation = /\p{Emoji_Presentation}/gu;
console.log(sentence.match(regexpEmojiPresentation)); // Array ["👌"]
  • Assertions : 줄이나 단어의 시작과 끝은 나타내는 경계 그리고 일치가 가능한 방법을 나타내는 패턴 등
  • Character classes : 문자와 숫자 같은 문자의 종류를 구분한다.
  • Groups and Ranges : 표현 문자의 그룹과 범위를 나타낸다.
  • Quantifiers : 일치시킬 문자 또는 식을 나타낸다.
  • Unicode property escapes : 이모지, 구두점, 문자를 일치시킬수 있다.

 

플래그

// 정규 표현식
const re = /패턴/플래그;

// 생성자 함수
const re = new RegExp('패턴', '플래그');
  • 전역 탐색이나 대소문자 무시와 같은 특성을 지정한다.
  • 단독으로 사용 가능하며 순서와 상관없이 여럿을 지정할 수 있다.

 

플래그 설명
d 부분 문자열 일치에 대해 인덱스 생성
g 전역 탐색
i 대소문자 구분하지 않음
m 여러 줄에 걸쳐 탐색
s 개행 문자가 .과 일치
u 패턴을 유니코드 코드 포인트의 시퀀스로 간주
y 대상 문자열의 위치에서 탐색을 시작

 

적용

// s는 문자열
const replacedS = s.replace(/[0-9]/g, '');
  • s문자열에서 0~9를 전역 탐색해서 빈 문자열로 바꿔라 라는 코드이다.

솔직히 아직 잘 모르겠다... 다음에도 보면서 작성할 것을 알지만 그래도 다음은 지금보다 낫을거라고 믿는다.