<aside> <img src="/icons/search_gray.svg" alt="/icons/search_gray.svg" width="40px" /> 영어에서 Contraction(축약/단축형)과 Abbreviation(약어/축약어)는 다른 개념이다.

축약은 분리 기준에서 제외하는 정규식

// 단어 문자가 아닌 문자열과 일치
const NonWordCharPattern = /(\\W)/g;
const sentence = "I'll make coffee and I've done my homework."

// 단어 문자가 아닌 문자열 양쪽에 공백 추가 e.g. '.' → ' . '
const replaced = sentence.replace(NonWordCharPattern, " $1 ");
// "I ' ll   make   coffee   and   I ' ve   done   my   homework . "

replaced.split(/\\s+/);
// ['I', "'", 'll', 'make', 'coffee', 'and', 'I', "'", 've', 'done', 'my', 'homework', '.', '']

// 단어 문자나 아포스트로피(')가 아닌 모든 문자와 일치
const NonWordCharPattern = /([^\\w'])/g;

// 단어 문자나 아포스트로피가 아닌 문자열 양쪽에 공백 추가 e.g. ' ' → '   '
const replaced = "I'll make coffee and I've done my homework.".replace(NonWordCharPattern, " $1 ");
// "I'll   make   coffee   and   I've   done   my   homework . "

replaced.split(/\\s+/);
// ["I'll", 'make', 'coffee', 'and', "I've", 'done', 'my', 'homework', '.', '']

문장내 축약된 단어의 위치 인덱스를 반환하는 findContrIndexes

const ContractionPattern = /\\b\\w+'\\w*\\b/;

const findContrIndexes = (arr: string[]) => {
  return arr.reduce((acc: number[], cur, i) => {
    return ContractionPattern.test(cur) ? acc.concat(i) : acc;
  }, []);
};

findContrIndexes(["I'll", 'make', 'coffee', 'and', "I've", 'done', 'my', 'homework', '.'])
// 반환값 [0, 4]

I've can't 등 다양한 축약 케이스를 식별하기 위해 /\\b\\w+'\\w*\\b/ 정규식 사용. \\w+' 는 아포스트로피(') 기준 앞에 있는 부분이고, \\w* 는 뒤에 있는 부분.

문장내 각 단어의 축약 정보를 반환하는 generateContrMap