replace & 정규표현식

박다영·2022년 12월 9일
0

javascript

목록 보기
10/15

알고리즘 문제



나의 정답풀이

function solution(numbers) {
  let answer = numbers
    .replace(/zero/g, 0)
    .replace(/one/g, 1)
    .replace(/two/g, 2)
    .replace(/three/g, 3)
    .replace(/four/g, 4)
    .replace(/five/g, 5)
    .replace(/six/g, 6)
    .replace(/seven/g, 7)
    .replace(/eight/g, 8)
    .replace(/nine/g, 9);

  return Number(answer);
}
  1. 정규표현식과 플래그 g 로 numbers 내의 문자열 zero ~ nine 을
    중복되는 값까지 모두 변환해줄 값으로 가져와준다.

  2. replace 를 사용해 numbers 로 받은 문자열 zero ~ nine 을
    각각 0 ~ 9 로 변환해주었다.

  3. 최종 return 값에 Number 를 붙여 문자열을 숫자로 변환해준다.



[내 첫 풀이의 오답 이유]

function solution(numbers) {
  let answer = numbers
    .replace(/zero/, 0)
    .replace(/one/, 1)
    .replace(/two/, 2)
    .replace(/three/, 3)
    .replace(/four/, 4)
    .replace(/five/, 5)
    .replace(/six/, 6)
    .replace(/seven/, 7)
    .replace(/eight/, 8)
    .replace(/nine/, 9);

  return Number(answer);
}

매치되는 모든 값을 반환하는 플래그 g를 쓰지 않아서
만약 oneone 처럼 같은 숫자가 두번 이상 겹치게 되면,
첫번째 one 만 반환해 변환하므로 1one 이렇게 반환되어서 틀린 값이 나온다.



[다른 정답 풀이]

function solution(numbers) {
  const obj = {
      zero: 0, one: 1, two: 2, three: 3, four: 4,
      five: 5, six: 6, seven: 7, eight: 8, nine: 9
  };

  const num = numbers.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g, (v) => {
      return obj[v];
  });

  return Number(num);
}
  1. (|) 연산자를 활용해서 regexp의 pattern 사이 사이에 넣어주면 다수의 pattern을 한번에 사용.

  2. 각각의 pattern 을 flags 내의 함수의 인수로 받는다.

  3. 각 인수를 obj 객체의 key 값으로 받아 value를 return 해준다.

  4. 최종 return 값에 Number 를 붙여 문자열을 숫자로 변환해준다.



관련 문법

[정규표현식]
정규 표현식(‘regexp’ 또는 'reg’라고 줄여서 사용)은 패턴(pattern) 과 선택적으로 사용할 수 있는 플래그(flag) 로 구성됩니다.

1) 긴 문법
regexp = new RegExp("pattern", "flags");

2) 짧은 문법
regexp = /pattern/; // 플래그가 없음
regexp = /pattern/gmi; // 플래그 g, m, i가 있음(각 플래그에 대해선 곧 다룰 예정)

[플래그 g]
g 플래그가 붙으면 패턴과 일치하는 모든 것들을 찾습니다.
g 플래그가 없으면 패턴과 일치하는 첫 번째 결과만 반환됩니다.

[(|) operator ]
정규표현식 내부에서 쓰이는 or 연산자



참고)
모던자바스크립트 - 패턴과 플래그
stackoverflow - (|) operator
mdn - replace

profile
개발과 디자인 두마리 토끼를!

0개의 댓글