정규표현식 정리

2019. 1. 14. 15:22Programming/JavaScript

반응형

코드 프로그래머스 정규표현식 의 내용을 정리한 글입니다. 다만 해당 강의는 파이썬을 사용하나, 아직 파이썬에 익숙하지 않으므로 글의 내용은 Javascript를 기준으로 작성됐습니다.

정규표현식(正規表現式/regular expression): 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. - 위키백과 정규표현식

간단하게 말하면 특정 규칙에 맞는 글자만 걸러내주는, 필터의 개념으로 생각해도 무방하다. 프론트엔드에서는 전화번호 형식, 이메일 형식, 비밀번호 체크 등에 사용할 수 있다.

정규표현식 생성법

문자로 표기해서 생성할수도 있고, 생성자로 만들수도 있다.

/pattern/flags //리터럴 방식
new RegExp(pattern[, flags]) //생성자 방식

pattern은 정규식을 의미한다. 우선 flags값을 보도록 하자.

flags 의미
g global match: 문장의 전체에서 일치하는 문자를 검색한다.
i ignore case: 대소문자를 구별하지 않는다.
m multiline: ^또는 $이 다중행에 적용되도록 한다.
y 조사 후 재작성 예정. exploringjs.com 설명 참조

정규표현식에서 특별한 의미를 갖는 문자들 (자주 쓰는 내용만 추렸다.)

키워드 의미
. \n, \r과 같은 행 종결자를 제외한 모든 문자를 의미한다.
\d 숫자를 의미한다.
\w 문자를 의미한다.
\s 스페이스, 탭 등의 공백문자를 의미한다.
\D 숫자를 제외한 문자를 의미한다.
\S 공백문자를 제외한 문자를 의미한다.
\W 영문자, _를 제외한 문자를 의미한다.
\t TAB을 의미한다.
\r 캐리지 리턴을 의미한다.
\n 줄바꿈(linefeed)를 의미한다.

출처 및 참고: 정규표현식에서 특별한 의미를 갖는 문자들

예시는 아래와 같다.

const text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

text.match(/\w\w\w/); //match 메소드는 문자열에서 정규표현식과 일치하는 문자열을 반환한다.

반환값:

["Lor", index: 0, input: "Lorem ipsum dolor sit amet, consectetur adipiscing… qui officia deserunt mollit anim id est laborum.", groups: undefined]

위의 출력은 문자문자문자의 표현식과 일치하는 단어 중, 가장 처음 만난 단어를 반환한 결과다. 첫번째 문장이 아니라 주어진 텍스트 전체에서 표현식과 일치하는 단어들을 모두 찾으려면, 정규표현식을 선언할 때 flag로 g를 주면 된다. 아래의 예시와 출력결과를 확인하자.

const text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

text.match(/\w\w\w/g); //match 메소드는 문자열에서 정규표현식과 일치하는 문자열을 반환한다.

반환값:

(97) ["Lor", "ips", "dol", "sit", "ame", "con", "sec", "tet", "adi", "pis", "cin", "eli", "sed", "eiu", "smo", "tem", "por", "inc", "idi", "dun", "lab", "ore", "dol", "ore", "mag", "ali", "qua", "eni", "min", "ven", "iam", "qui", "nos", "tru", "exe", "rci", "tat", "ion", "ull", "amc", "lab", "ori", "nis", "ali", "qui", "com", "mod", "con", "seq", "uat", "Dui", "aut", "iru", "dol", "rep", "reh", "end", "eri", "vol", "upt", "ate", "vel", "ess", "cil", "lum", "dol", "ore", "fug", "iat", "nul", "par", "iat", "Exc", "ept", "eur", "sin", "occ", "aec", "cup", "ida", "tat", "non", "pro", "ide", "sun", "cul", "qui", "off", "ici", "des", "eru", "mol", "lit", "ani", "est", "lab", "oru"];

특정 문자의 갯수 지정하기

위의 예문에서는 문자가 세 개 나오는 표현식을 사용한다. 그렇다면 문자 다섯개로 이루어진 단어들을 뽑아내려면 어떻게 해야할까? \w\w\w\w\w처럼 써도 동작은 하겠지만, 모양이 영 그렇다. 이럴때는 다음과 같은 방법을 사용하여, 문자열의 갯수를 지정할 수 있다.

사용법 의미
{n} 앞의 문자가 n번 반복됨을 의미한다.
{n,m} 앞의 문자가 n번 이상 m번 이하 반복됨을 의미한다.
{n,} 앞의 문자가 n번 이상 반복됨을 의미한다.
const text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

text.match(/\w{5}/);

반환값:

["Lorem", index: 0, input: "Lorem ipsum dolor sit amet, consectetur adipiscing… qui officia deserunt mollit anim id est laborum.", groups: undefined]

문자열이 포함되어있거나 혹은 포함되어있지 않을 경우

위에 정리한 내용들을 토대로, 전화번호를 검색하는 정규표현식을 작성할 수 있다. 전화번호는 보통 [두자리 혹은 세자리의 숫자]-[세자리 혹은 네자리 숫자]-[네자리 숫자]의 형식을 따른다. 따라서 다음과같이 작성하면, 전화번호를 추려낼 수 있다.

const test2 = "010-0000-0000 031-000-0000 980000-0000000 032-0000-0000";

test2.match(/\d{2,3}-\d{3,4}-\d{4}/g);

반환값:

(3) ["010-0000-0000", "031-000-0000", "032-0000-0000"]

하지만 만약 -를 사용하지 않은 경우도 찾아내고 싶다면, 어떻게 해야할까? 이럴때는 ? 키워드를 사용하여 작성할 수 있다. 예를들어서 -?와같이 작성하는 경우, -가 나오거나 혹은 나오지 않는 경우를 검색할 수 있다.

const test3 = "000-0000-0000 00000000000 000+0000+0000 000 0000 0000";

test3.match(/\d{2,3}-?\d{3,4}-?\d{4}/g);

반환값:

(2) ["000-0000-0000", "00000000000"]

여기서 -대신 스페이스를 사용한 경우는 검출이 되지 않는다. 여기서 대쉬 대신 스페이스를 사용하기 위해서는, 다음과 같은 문자열 그룹과 ? 키워드를 함께 사용해야 한다.

const test4 = "000-0000-0000 00000000000 000+0000+0000 000 0000 0000";

test4.match(/\d{2,3}[- ]?\d{3,4}[- ]?\d{4}/g);

반환값:

(3) ["000-0000-0000", "00000000000", "000 000 0000"]

참조

RegExp, MDN 웹 문서 - Mozilla
정규 표현식 (좀 더) 깊이 알아보기, Jitae Kim 님
[정규표현식, 코드프로그래머스] (https://programmers.co.kr/learn/courses/11)

반응형