How to remove duplicate case‑insensitive words separated by multiple delimiters from a string in TypeScript

1 Answer

0 votes
/*
    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

*/

 



answered Aug 2 by avibootz

Related questions

...