/*
Remove duplicate case‑insensitive words separated by multiple delimiters.
Features:
- Case‑insensitive comparison (toLowerCase)
- Preserves original casing of the first occurrence
- Trims whitespace around tokens
- Supports ANY number of delimiters (including multi‑character)
- Preserves original order
- Efficient O(n) lookup using Set<string>
*/
/* ---------------------------------------------------------------
Build a regex that matches ANY delimiter
--------------------------------------------------------------- */
function buildDelimiterRegex(delimiters: string[]): RegExp {
// Escape delimiters so characters like "|" or "*" are treated literally
const escaped: string[] = delimiters.map((d: string): string =>
d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
);
return new RegExp(`(?:${escaped.join("|")})+`, "g");
}
/* ---------------------------------------------------------------
Split input string using multiple delimiters
--------------------------------------------------------------- */
function splitByDelimiters(input: string, delimiters: string[]): string[] {
const regex: RegExp = buildDelimiterRegex(delimiters);
return input
.split(regex)
.map((t: string): string => t.trim())
.filter((t: string): boolean => t.length > 0);
}
/* ---------------------------------------------------------------
Remove duplicates (case‑insensitive)
--------------------------------------------------------------- */
function removeDuplicatesCaseInsensitive(tokens: string[]): string[] {
const seen: Set<string> = new Set<string>();
const unique: string[] = [];
for (const token of tokens) {
const key: string = token.toLowerCase();
if (!seen.has(key)) {
seen.add(key);
unique.push(token);
}
}
return unique;
}
/* ---------------------------------------------------------------
Join tokens with a chosen delimiter
--------------------------------------------------------------- */
function joinTokens(tokens: string[], delimiter: string): string {
return tokens.join(delimiter);
}
/* ---------------------------------------------------------------
Remove duplicates (Multi Delimiter case‑insensitive)
--------------------------------------------------------------- */
function removeDuplicatesMultiDelimiterCI(
input: string,
delimiters: string[],
outputDelimiter: string
): string {
const tokens: string[] = splitByDelimiters(input, delimiters);
const unique: string[] = removeDuplicatesCaseInsensitive(tokens);
return joinTokens(unique, outputDelimiter);
}
/* ---------------------------------------------------------------
Main
--------------------------------------------------------------- */
const s: string =
"AAA | aaa , aAA * aaA | AAa | AAA | BBB | ccc ---- CCC | AAA ; aaa | bbb";
const delimiters: string[] = [" ", "|", ",", "*", "-", ";"];
const result: string = removeDuplicatesMultiDelimiterCI(s, delimiters, " | ");
console.log(result);
/*
run:
AAA | BBB | ccc
*/