정규식을 이용한 개미수열 만들기

brouk2426·2021년 1월 26일
0

개미 수열 만들기

워낙 구글에 검색하다보면 많이 나오는 개미 수열 입니당...

항상 이런 문자열에 관련된 문제를 보면 정규식을 이용해서 풀어보고 싶기도 하고, 정규식을 공부하게 되더라구요

레퍼런스들을 찾다가 외국분들의 개미수열 만드는 함수에 대해 참고하게 되었습니당

코드는 아래와 같습니다

코드

function ant_sequence(seq: string) {
  const ant_reg_exp = new RegExp(/(\d)\1+/g);
  return seq.replace(ant_reg_exp, (m, s) => s + m.length);
}

함수 설명

정규식에 대해서는 많이들 아시겠지만.. 저는 잘 모르니 공부를 할겸 정리해보려구 포스트를 남깁니다

\d: [0 - 9]의 숫자를 의미합니다. 그렇다면 당연히 \D는 숫자가 아닌 것들을 의미하겠죠?
(): 괄호안의 값들을 그룹화 해줍니다. 각각의 숫자들이 그룹화가 되겠네요
\1: 앞에서 캡쳐한 그룹들 중 1번 그룹을 재사용하는 것을 표현합니다
+: 앞의 동일한 족이 1번이상임을 표현합니다.
g: 마지막 키워드 g를 통해서 전역검색을 실시해줍시다!!

(\d)\1+의 경우는 1번그룹 (\d)를 매칭하고 그뒤에 (\d)가 몇번 나왔는지에 대해 표기를 해주는 또한 이 그룹 검색을 g를 통하여 전역검색을 실시하는 개미수열을 나타내는 정규식 표현입니다.
제가 레퍼런스로 봤던 분은 \* 수량한정자를 사용하시긴 했습니다만쓰.. 제 생각에는 숫자가 무조건 한번은 나오게 되어있기 때문에 +또한 적절하지 않을까 싶습니당..

마지막 seq.replace 부분은 일반적인 regex를 이용하여 문자열 replace를 실시한 것입니당

replace의 두번째 파라미터의 function의 형태가 궁금하신 분들은 이 포스트를 보신 뒤에도 MDN의 프로토 타입을 읽어보시면 더 좋을 것 같습니다!

설명을 드리자면 실제 해당 위치의 파라미터에는 순서대로 다음과 같은 값들이 들어오게 됩니다!

String.prototype.replace(regex, function)

function (match, p1, offset, string)

  • match : Regex를 실행한 후의 매치된 문자들이 나오게 됩니다. 저희는 1번이상 연속된 숫자들에 대해 매칭을 시켰기 때문에 처음엔 '111'이란 값이 나오게 되겠네요!

  • p1 : 첫번째 그룹과 매칭이 되게됩니다. (\d) 로 그룹화를 시켜주었기 때문에 '1' 값이 오게 됩니다.
    그룹이 여러개의 경우 p1,p2,p3의 형태로 오게 됩니다!
    예를 들어 저희가 정규 표현식을 /(\d)\1+(\D)+/g 이런식으로 표현을 했고, 문자열을 '111a222' 라는 값을 넣게 된다면 연속된 수 111과 숫자가아닌 a가 붙어 있는 111a값 만이 match되고 p1은 1, p2는 a가 반환되겠네요!

  • offset: 매치된 문자열의 offset, index 값 입니다! '111222' 를 넣게 되었다면 첫번째 콜백때는 0, 두번째 콜백때는 222가 위치한 3이 index값으로 오겠네요!

  • string: 조사된 전체 문자열을 반환해줍니다!

MDN - String.prototype.replace

느낀 점

개미 수열의 경우에는 구글링만 해보셔도 아시겠지만 참 다양한 방법들로 이미 많이들 구현을 해보셨던 문제이기도 합니다!

그래서 이번에 가능하다면 다른 방법을 시도해보고 싶었고, 그러던 와중 정말 정규식으로 사용하신 분의 코드를 보게되고 저도 정리하면서 정규식에 조금은 더 익숙해 지고 싶어서 이 포스트를 남깁니다!

혹시나 정규식이 친숙하지 않으신 분들에게 저는 개인적으로 되게 많이 친숙해질 수 있었던 기회였던 것 같습니다!

profile
Web Fullstack developer

0개의 댓글