부'산불'꽃축제가 되는 걸 막기 (feat. 정규표현식) [전국재난톡 개발노트]

Yoon Robin·2023년 11월 7일
post-thumbnail

문제

문제 발견

문제

부산불꽃축제에 관한 메시지는 '기타'로 잡혀야 한다.
그러나 사진과 같이 '산불'로 키워드가 잡혔다.

원인

includes()로 메시지(finalText)에서 해당 단어를 찾았기 때문에 발생한 문제였다.

코드

interface KeywordMap {
  [keyword: string]: string[];
}

export default function getKeywords(text: string) {
  const keywordMap: KeywordMap = {
    산불: ["산불"],
    //(기타 케이스 생략)
  };

  //(중간 코드 생략)
  
  for (const keyword in keywordMap) {
    for (const word of keywordMap[keyword]) {
   		if (finalText.includes(word)) {
        	return keyword;
      	}
    }
  }

  return "기타";
}

즉, 부산불꽃축제에서 '산불'이란 단어를 캐치해서 키워드를 산불로 반환한 것이다.

문제 해결

이 문제를 해결하기 위해 정규표현식을 사용해보기로 했고, 다음과 같이 성공했다.

내가 쓴 코드를 먼저 보여준 다음 상세 설명을 하겠다.

내가 쓴 코드

  for (const keyword in keywordMap) {
    for (const word of keywordMap[keyword]) {
      let regexp = new RegExp(`(\\s|])${word}`);
      if (regexp.test(finalText)) {
        return keyword;
      }
    }
  }

  return "기타";
}

정규표현식 설명

  1. 정규표현식이란?

    정규 표현식(regular expression)은 문자 검색과 교체에 사용되는 패턴으로 강력한 기능을 제공합니다.

  2. 내가 사용한 정규표현식 기본 문법

    • 정규표현식 '긴' 문법
    regexp = new RegExp("pattern", "flags");

    나의 경우에는 특정 flag를 넣지 않고, pattern 만 넣었다.

  3. 패턴 설명

    	let regexp = new RegExp(`(\\s|])${word}`);
    • 패턴: word 변수 앞에 공백(\s)이나 ] 문자가 있다.

    • \s : 'space(공백)'의 ‘s’를 의미한다. 스페이스, 탭(\t), 줄 바꿈(\n)을 비롯하여 아주 드물게 쓰이는 \v, \f, \r 을 포함하는 공백 기호이다.

  4. regexp.test로 일치 여부 확인하기

    패턴과 일치하는 부분 문자열이 하나라도 있는 경우 메서드 regexp.test(str)을 호출하면 true가, 그렇지 않으면 false가 반환됩니다.

  for (const keyword in keywordMap) {
    for (const word of keywordMap[keyword]) {
      let regexp = new RegExp(`(\\s|])${word}`);
      if (regexp.test(finalText)) {
        return keyword;
      }
    }
  }

메시지 내용(finalText)에서 패턴과 일치하는 부분 문자열이 하나라도 있는 경우 true로 반환하여 keyword가 추출되도록 만들었다.

마무리

어렴풋이 알던 정규표현식을 이렇게 실전에서 사용하여 문제를 해결할 수 있어서 좋았다.
이번에도 이렇게 경험치가 쌓이게 되었네.🥰

profile
주니어 프론트엔드 개발자

0개의 댓글