

부산불꽃축제에 관한 메시지는 '기타'로 잡혀야 한다.
그러나 사진과 같이 '산불'로 키워드가 잡혔다.
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 "기타";
}
정규표현식이란?
정규 표현식(regular expression)은 문자 검색과 교체에 사용되는 패턴으로 강력한 기능을 제공합니다.
내가 사용한 정규표현식 기본 문법
regexp = new RegExp("pattern", "flags");
나의 경우에는 특정 flag를 넣지 않고, pattern 만 넣었다.
패턴 설명
let regexp = new RegExp(`(\\s|])${word}`);
패턴: word 변수 앞에 공백(\s)이나 ] 문자가 있다.
\s : 'space(공백)'의 ‘s’를 의미한다. 스페이스, 탭(\t), 줄 바꿈(\n)을 비롯하여 아주 드물게 쓰이는 \v, \f, \r 을 포함하는 공백 기호이다.
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가 추출되도록 만들었다.
어렴풋이 알던 정규표현식을 이렇게 실전에서 사용하여 문제를 해결할 수 있어서 좋았다.
이번에도 이렇게 경험치가 쌓이게 되었네.🥰