알고리즘을 배우다보면 종종 정규 표현식을 사용해서 해결하는 문제가 나온다. 하지만 그때마다 정규 표현식을 사용하지않고 다른 방법으로 문제를 해결했는데, 수업시간에 정규 표현식을 배우고 얼마나 편리한 방식인지 깨달았고, 알고리즘문제 뿐만 아니라 실제로 현업에서도 많이 활용한다는 것을 깨달았다. 많이 활용되는만큼 중요하다고생각해 한 번 정리해보고 내것으로 만들고싶어 이번 블로그를 쓰게 되었다.
정규 표현식은 문자열에 나타나는 특정 문자 조합과 대응시키기 위해 사용되는 패턴입니다.
MDN에서는 정규 표현식을 이렇게 정의해뒀다. 즉, 정규 표현식이란 문자, 숫자, 특수기호의 조합의 문장에서 특정 패턴을 찾고 싶을때 사용한다. 정규식을 만드는 방법은 슬래쉬로 감싸거나 RegExp 객체의 생성자 함수를 호출하는 두 가지 방법이 존재한다.
const regexEtc = /ab/i;
const regexEtc2 = new RegExp("ab");
주로 사용자의 입력을 받거나 다른 곳에서 패턴을 가져와야하는 경우 생성자 함수 방법을 사용한다. 하지만 일반적으로는 정규 표현식 리터럴을 사용한다.
정규식을 사용하는 메서드 중 많이 사용하는 메서드에는 exec, test, match가 존재한다.
/A{3,4}/g.test('AAA'); // => AAA, AAAA인 경우 true
/A+/g //=> A가 한 번 이상이기만 하면 다 true
/AB?C/g // => B가 0-1번 반복되고 C가 바로 뒤에 오는 문자열을 찾아라.
/[A-Z]+/g // => A-Z가 한 번 이상 반복되는 경우
숫자를 의미하는 \d와 , 문자를 의미하는 \D가 존재하는데 이는 [A-Z]나 [0-9]랑 똑같은 역할을 한다. 또한 \w는 알파벳, 숫자, 언더스코어까지 말한다. (거의 항상 대문자는 소문자의 경우와 반대 역할을 한다. ) 그리고 만약 부정을 사용하고싶다면 []내에 ^를 사용하면된다. (주의해야할점은 []밖에 ^를 사용한다면 문자열이 해당 패턴으로 시작하는지 찾는것이다. 마지막 위치는 문자열 뒤에 $를 붙여주면된다.)
이번 블로그를 쓰면서 처음 깨달았던 부분은 정규식도 객체라는 것이다. 자바스크립트 공부 초반에 웬만한 것 모두 자바스크립트에서는 객체라고 배웠는데, 정규식도 객체라는 점이 신기했다 (사실 '식'이기때문에 객체라는 사실은 당연하지만, 객체라고 인지하지 못하다 인지하니 정말 신기했다...)
그리고 정규식표현을 이해하다보니 생각보다 그렇게 어렵지 않다는것을 (내가 생각했던것보다...너무 막연한 두려움을 가진것같다) 깨달았다. 오늘 정리한것을 토대로 정규식 문제를 한 번 풀어보려고 한다. 만약, 문제를 풀다 예쁜 코드를 만들게된다면 한 번 공유해보고자한다.