kakasoo

ReplaceAll, 동일한 문자열을 모두 대체한 다음의 문자열 본문

프로그래밍/TypeScript

ReplaceAll, 동일한 문자열을 모두 대체한 다음의 문자열

카카수(kakasoo) 2023. 3. 23. 01:00
반응형
type ReplaceAll<S extends string, From extends string, To extends string> = 
  S extends From ? To : (
    S extends `${From}${infer Rest}` ? `${To}${ReplaceAll<Rest, From, To>}` :
      (S extends `${infer First}${From}${infer Last}` ? `${First}${To}${ReplaceAll<Last, From, To>}`: 
      (S extends `${infer First}${From}` ? `${First}${To}` : S)));

좀 복잡해보이지만 이렇게 정의할 수 있다.

S가 나올 수 있는 경우는

이미 From인 경우,

뒤에 다른 문자열 포함한 From인 경우,

앞과 뒤에 다른 문자열을 포함한 From인 경우,

그리고 앞에만 다른 문자열을 포함한 From인 경우,

From이 포함되지 않은 경우, 이렇게 5가지가 나온다.

 

type ReplaceAll<S extends string, From extends string, To extends string> = 
  From extends '' ? S :
  S extends From ? To : (
    S extends `${From}${infer Rest}` ? `${To}${ReplaceAll<Rest, From, To>}` :
      (S extends `${infer First}${From}${infer Last}` ? `${First}${To}${ReplaceAll<Last, From, To>}`: 
      (S extends `${infer First}${From}` ? `${First}${To}` : S)));

여기에 From이 빈 문자열을 포함하면 모든 조건이 완료된다.

각 조건에 대해서는 나머지 문자 ( 반드시 뒷 부분이 되어야 한다, 앞은 재귀로 인해 이미 검증된 부분이기 때문 )  를 재귀로 풀면 된다.

반응형