How to multi-split the text while going deeper into details by level

Mansour_Dalir 1,876 Reputation points
2024-11-02T05:47:54.5333333+00:00

vb

How to multi-split the text while going deeper into details by level

'This is the input text
   Dim MyString As String = "00[A]1111{C}22(B)33333{C}4{C}5{C}666[A]777(B)8(B)99{C}999[A]101010"
'The expected output is an array as shown below
Dim Result as String()={"]1111{","}22(",")33333{","}4{","}5{","}666[",")99{","}999["}

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim MyString As String = "00[A]1111{C}22(B)33333{C}4{C}5{C}666[A]777(B)8(B)99{C}999[A]101010"
         Dim LevelSplit As String() = {"A", "B", "C"}
        MultiFinderString(MyString, LevelSplit(0), LevelSplit)
 End Sub
Dim LisCheck As New List(Of String)
    Private Function MultiFinderString(BodyText As String, find As String, Optional MultiFind As String() = Nothing) As String
        Dim result As New List(Of Integer)()
        Dim position As Integer = InStr(BodyText, find)
        If position > 0 Then
            If position > 1 Then
                result.Add(1)
            End If
            While position > 0
                result.Add(position)
                position = InStr(position + 1, BodyText, find)
            End While
            If result(result.Count - 1) < BodyText.Length Then
                result.Add(BodyText.Length)
            End If
            Dim MyInteger As Integer() = result.ToArray

Dim ResultStr As String() = MyInteger.Select(Function(x, index)
   If index < MyInteger.Length - 2 Then                                                           Return $"{x }-{MyInteger(index + 1) - 1}"                                                           Else
Return $"{x}-{MyInteger.Last() + 1}"                                                             End If
End Function).Take(MyInteger.Length - 1).ToArray()


            Dim level As Integer
            level += 1
            For Each Itm In ResultStr
                Dim intStart, IntEnd As Integer
                intStart = Val(Split(Itm, "-")(0))
                IntEnd = Val(Split(Itm, "-")(1))
                Dim sttMid As String = Mid(BodyText, intStart, Math.Abs(IntEnd - intStart))
                Dim stt4 As String = MultiFinderString(sttMid, MultiFind(level))
                Return stt4
                LisCheck.Add(sttMid)
            Next
        End If
    End Function

VB
VB
An object-oriented programming language developed by Microsoft that is implemented on the .NET Framework. Previously known as Visual Basic .NET.
2,733 questions
0 comments No comments
{count} votes

2 answers

Sort by: Most helpful
  1. Q&A Assist
    2024-11-02T05:47:54.5366667+00:00
    AI generated content. This question contains an answer created with AI from Q&A Assist. Learn more

    To achieve multi-splitting of the text based on different levels of delimiters in Visual Basic, you can modify your approach to handle each delimiter separately and recursively. The provided code snippet is a good starting point, but it needs adjustments to correctly return the expected output.

    Here’s a revised version of your function that processes the string based on multiple delimiters:

    Private Function MultiFinderString(BodyText As String, find As String, Optional MultiFind As String() = Nothing) As List(Of String)
        Dim result As New List(Of String)()
        Dim position As Integer = InStr(BodyText, find)
    
        While position > 0
            Dim startPos As Integer = position - 1
            Dim endPos As Integer = position + Len(find) - 1
    
            ' Capture the substring around the found delimiter
            If startPos >= 0 And endPos < BodyText.Length Then
                result.Add(Mid(BodyText, startPos, endPos - startPos + 1))
            End If
    
            position = InStr(position + 1, BodyText, find)
        End While
    
        ' Recursively process for the next level of delimiters
        If MultiFind IsNot Nothing AndAlso MultiFind.Length > 1 Then
            Dim nextLevelResults As New List(Of String)()
            For Each item In result
                Dim nextResults = MultiFinderString(item, MultiFind(1), MultiFind.Skip(1).ToArray())
                nextLevelResults.AddRange(nextResults)
            Next
            Return nextLevelResults
        End If
    
        Return result
    End Function
    

    In this function:

    • It searches for the specified delimiter and captures the surrounding text.
    • It recursively processes the found substrings for the next level of delimiters.
    • The results are collected and returned as a list of strings.

    You can call this function with your initial string and the array of delimiters to get the desired output.


    References:

    0 comments No comments

  2. Mansour_Dalir 1,876 Reputation points
    2024-11-02T07:21:23.2033333+00:00
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim MyString As String = "00[A]1111{C}22(B)33333{C}4{C}5{C}666[A]777(B)8(B)99{C}999[A]101010"
            Dim LevelSplit As New List(Of String)
            LevelSplit.AddRange({"A", "B", "C"})
            Dim Result As String() = MultiFinderString(MyString, LevelSplit)
        End Sub
        Function MultiFinderString(BodyText As String, MultiFind As List(Of String)) As String()
            Dim Seprator As Char = Microsoft.VisualBasic.Chr(3)
            For Each item In MultiFind
                Dim idx As Integer = MultiFind.IndexOf(item)
                If idx = MultiFind.Count - 1 Then
                    Dim sttSetup As String = Join(BodyText.Split(Seprator).Where(Function(f) f Like "*" & item & "*").Select(Function(f) f).ToArray, item)
                    Return Split(sttSetup, item)
                Else
                    BodyText = Replace(BodyText, item, Seprator)
                End If
            Next
        End Function
    
    
    0 comments No comments

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.