/*
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
*/
/* ---------------------------------------------------------------
Build a regex that matches ANY delimiter
--------------------------------------------------------------- */
function buildDelimiterRegex(delimiters) {
// Escape delimiters so characters like "|" or "*" are treated literally
const escaped = delimiters.map(d => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
return new RegExp(`(?:${escaped.join("|")})+`, "g");
}
/* ---------------------------------------------------------------
Split input string using multiple delimiters
--------------------------------------------------------------- */
function splitByDelimiters(input, delimiters) {
const regex = buildDelimiterRegex(delimiters);
return input.split(regex).map(t => t.trim()).filter(t => t.length > 0);
}
/* ---------------------------------------------------------------
Remove duplicates (case‑insensitive)
--------------------------------------------------------------- */
function removeDuplicatesCaseInsensitive(tokens) {
const seen = new Set();
const unique = [];
for (const token of tokens) {
const key = token.toLowerCase();
if (!seen.has(key)) {
seen.add(key);
unique.push(token);
}
}
return unique;
}
/* ---------------------------------------------------------------
Join tokens with a chosen delimiter
--------------------------------------------------------------- */
function joinTokens(tokens, delimiter) {
return tokens.join(delimiter);
}
/* ---------------------------------------------------------------
Remove duplicates (Multi Delimiter case‑insensitive)
--------------------------------------------------------------- */
function removeDuplicatesMultiDelimiterCI(input, delimiters, outputDelimiter) {
const tokens = splitByDelimiters(input, delimiters);
const unique = removeDuplicatesCaseInsensitive(tokens);
return joinTokens(unique, outputDelimiter);
}
/* ---------------------------------------------------------------
Main
--------------------------------------------------------------- */
const s = "AAA | aaa , aAA * aaA | AAa | AAA | BBB | ccc ---- CCC | AAA ; aaa | bbb";
const delimiters = [" ", "|", ",", "*", "-", ";"];
const result = removeDuplicatesMultiDelimiterCI(s, delimiters, " | ");
console.log(result);
/*
run:
AAA | BBB | ccc
*/