정규 표현식 뽀개기

jjyung·2021년 10월 22일
0

JS

목록 보기
10/13
post-thumbnail

글을 쓰게된 계기

알고리즘을 배우다보면 종종 정규 표현식을 사용해서 해결하는 문제가 나온다. 하지만 그때마다 정규 표현식을 사용하지않고 다른 방법으로 문제를 해결했는데, 수업시간에 정규 표현식을 배우고 얼마나 편리한 방식인지 깨달았고, 알고리즘문제 뿐만 아니라 실제로 현업에서도 많이 활용한다는 것을 깨달았다. 많이 활용되는만큼 중요하다고생각해 한 번 정리해보고 내것으로 만들고싶어 이번 블로그를 쓰게 되었다.

정규 표현식은 문자열에 나타나는 특정 문자 조합과 대응시키기 위해 사용되는 패턴입니다.

MDN에서는 정규 표현식을 이렇게 정의해뒀다. 즉, 정규 표현식이란 문자, 숫자, 특수기호의 조합의 문장에서 특정 패턴을 찾고 싶을때 사용한다. 정규식을 만드는 방법은 슬래쉬로 감싸거나 RegExp 객체의 생성자 함수를 호출하는 두 가지 방법이 존재한다.

const regexEtc = /ab/i;
const regexEtc2 = new RegExp("ab");

주로 사용자의 입력을 받거나 다른 곳에서 패턴을 가져와야하는 경우 생성자 함수 방법을 사용한다. 하지만 일반적으로는 정규 표현식 리터럴을 사용한다.

정규식을 사용하는 메서드 중 많이 사용하는 메서드에는 exec, test, match가 존재한다.

RegExp.prototype.exec

  • 인수로 전달받은 문자열에서 정규식 패턴을 검색하여 매칭된 결과를 배열로 반환하는데, 결과가 없는 경우는 null을 반환한다.

RegExp.prototype.test

  • exec와 유사하지만 매칭 결과를 불리언값을 리턴한다는점이 다르다. 그래서 만약 true, false값이 필요하다면 test를 사용하는 편이 더 좋다.

RegExp.prototype.match

  • exec와 유사하지만 인수로 정규 표현식을 전달 받는다는 점이 다르다.

플래그

  • 총 6개의 플래그가 있지만 가장 많이 사용하는 플래그는 i, g, m이 있다. i는 대소문자를 구분하지않겠다는 ignore, g는 전역에서 모든 문자열을 검색하겠다는 global, m은 개행이 되더라도 패턴을 검색하라는 multi line의 의미이다.

반복 검색

  • 패턴에서 해당 문자(열)이 반복되는 패턴을 검색하고싶다면 {m,n}을 적으면된다. 그러면 최소 m번, 최대 n번이 반복되는 문자열을 검색할 수 있다. 만약 n자리를 공백으로 비워둔다면 m이상이기만 하면 다 찾겠다는 의미다. 중괄호를 사용하기 귀찮다면 +를 붙여주면 1번 이상 반복되는 문자열을 매칭하겠다는 의미이다. 만약 ?를 사용한다면 ?앞에 있는 문자가 최대 한 번 (0-1번) 이상 반복되고 ? 뒤에 있는 문자가 이어지는 문자열을 찾고자하는 것이다.
/A{3,4}/g.test('AAA'); // => AAA, AAAA인 경우 true
/A+/g //=> A가 한 번 이상이기만 하면 다 true
/AB?C/g // => B가 0-1번 반복되고 C가 바로 뒤에 오는 문자열을 찾아라. 

OR 검색

  • |는 또는이란 의미를 가진다. 만약 /A+|B+/를 한다면 A가 1번 이상 또는 B가 1번 이상인 경우를 찾게된다. 하지만 실제로는 |보다는 []를 많이 사용한다. 문자의 경우 []도 |랑 같은 역할을해서, 범위를 지정할때 []를 많이 사용한다.
/[A-Z]+/g // => A-Z가 한 번 이상 반복되는 경우 

패턴 검색

숫자를 의미하는 \d와 , 문자를 의미하는 \D가 존재하는데 이는 [A-Z]나 [0-9]랑 똑같은 역할을 한다. 또한 \w는 알파벳, 숫자, 언더스코어까지 말한다. (거의 항상 대문자는 소문자의 경우와 반대 역할을 한다. ) 그리고 만약 부정을 사용하고싶다면 []내에 ^를 사용하면된다. (주의해야할점은 []밖에 ^를 사용한다면 문자열이 해당 패턴으로 시작하는지 찾는것이다. 마지막 위치는 문자열 뒤에 $를 붙여주면된다.)

느낀점

이번 블로그를 쓰면서 처음 깨달았던 부분은 정규식도 객체라는 것이다. 자바스크립트 공부 초반에 웬만한 것 모두 자바스크립트에서는 객체라고 배웠는데, 정규식도 객체라는 점이 신기했다 (사실 '식'이기때문에 객체라는 사실은 당연하지만, 객체라고 인지하지 못하다 인지하니 정말 신기했다...)

그리고 정규식표현을 이해하다보니 생각보다 그렇게 어렵지 않다는것을 (내가 생각했던것보다...너무 막연한 두려움을 가진것같다) 깨달았다. 오늘 정리한것을 토대로 정규식 문제를 한 번 풀어보려고 한다. 만약, 문제를 풀다 예쁜 코드를 만들게된다면 한 번 공유해보고자한다.

profile
🏃‍♀️movin' forward, developer

0개의 댓글