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

1 Answer

0 votes
Imports System
Imports System.Text.RegularExpressions
Imports System.Collections.Generic

Module Module1

    '---------------------------------------------------------------
    ' removeDuplicatesMultiDelimiterCI
    '
    ' Removes duplicate words separated by multiple delimiters.
    '
    ' Features:
    ' - Case‑insensitive comparison (using ToLowerInvariant)
    ' - 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 HashSet(Of String)
    '
    ' Algorithm:
    ' 1. Build a regex that matches ANY delimiter.
    ' 2. Replace all delimiters with a single sentinel.
    ' 3. Split by that sentinel.
    ' 4. Trim each token.
    ' 5. Convert to lowercase for comparison.
    ' 6. Keep only first occurrence.
    ' 7. Reassemble using a chosen delimiter.
    '---------------------------------------------------------------
    Function RemoveDuplicatesMultiDelimiterCI(
        input As String,
        delimiters As List(Of String),
        outputDelimiter As String
    ) As String

        ' Step 1: Build a regex that matches ANY delimiter
        Dim escaped As New List(Of String)
        For Each d In delimiters
            escaped.Add(Regex.Escape(d))
        Next

        Dim pattern As String = "(" & String.Join("|", escaped) & ")"

        ' Step 2: Replace all delimiters with a sentinel
	Dim sentinel As String = Environment.NewLine
        Dim normalized As String = Regex.Replace(input, pattern, sentinel)

        ' Step 3: Split by sentinel
        Dim tokens As String() = normalized.Split(New String() {sentinel},
                                                  StringSplitOptions.RemoveEmptyEntries)

        ' Step 4: Remove duplicates (case‑insensitive)
        Dim seen As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
        Dim unique As New List(Of String)

        For Each token In tokens
            Dim trimmed As String = token.Trim()
            If trimmed = "" Then Continue For

            Dim key As String = trimmed.ToLowerInvariant()

            If Not seen.Contains(key) Then
                seen.Add(key)
                unique.Add(trimmed)
            End If
        Next

        ' Step 5: Reassemble
        Return String.Join(outputDelimiter, unique)
    End Function

    Sub Main()
        Dim s As String =
            "AAA | aaa ,   aAA * aaA | AAa | AAA   | BBB | ccc ---- CCC | AAA ; aaa | bbb"

        Dim delimiters As New List(Of String) From {
            "  ", "|", ",", "*", "-", ";"
        }

        Dim result As String =
            RemoveDuplicatesMultiDelimiterCI(s, delimiters, " | ")

        Console.WriteLine(result)
    End Sub

End Module



' run:
'
' AAA | BBB | ccc
'

 



answered Aug 1 by avibootz

Related questions

...