首页 > 解决方案 > 在多个分隔符之间拆分文本

问题描述

我正在进行的项目有一个相当棘手的问题。我非常需要从更大的字符串中提取多个分隔符之间的特定字符串。为了让您更好地理解,我的意思是,这里有一个例子:

Some Text that wont be needed 
Some Text that wont be needed 
Some Text that wont be needed 
Some Text that wont be needed 
Some Text that wont be needed 
Textstart (Start-Delimiter) 
Text I want 
Text I want 
Text I want 
Text I want 
Text I want
Textend (End-Delimiter)

到目前为止,很容易。但现在出现了一个混乱的部分。结束分隔符有时会像这样改变

Textstart 
Text I want 
Text I want 
Text I want 
Text I want 
Textend2 (another end delimiter)

我也解决了这个问题,但现在因为我发现,开始分隔符也可以在下一个结束部分之前出现两次。像这样:

Textstart (Start-Delimiter)
Text I want 
Text I want 
Textstart 
Text I want 
Text I want 
Textend (End-Delimiter) 

这真的让我很困惑。这是现在的功能。它有效,但前提是起始分隔符不出现两次。

我可以先用结束字符串分割文本,然后再用起始字符串分割文本,但我不知道如何用多个分隔符分割文本。

Function NewTextGet(ByVal Text As String, ByVal StartString As String, ByVal EndStrings() As String)
    Dim AllBlocks As New List(Of String)
    Dim FirstSplit() As String = Strings.Split(Text, StartString)                    ' Splits Text at Start delimiter
    For Each splt In FirstSplit.Skip(1)
        Dim EndSplit1 = splt.Split({EndStrings(0)}, StringSplitOptions.None)         ' First end delimiter Split
        Dim EndSplit2 = EndSplit1(0).Split({EndStrings(1)}, StringSplitOptions.None) ' Second delimiter Split
        Dim EndSplit3 = EndSplit2(0).Split({EndStrings(2)}, StringSplitOptions.None) ' Third delimiter Split
        If EndSplit3.Length > 1 Then
            AllBlocks.Add(EndSplit3(0))
        ElseIf EndSplit2.Length > 1 Then
            AllBlocks.Add(EndSplit2(0))
        Else
            AllBlocks.Add(EndSplit1(0))
        End If
    Next
    Return AllBlocks
End Function`


I hope I explained this well enough, and thank you for any help :)

标签: vb.net

解决方案


尝试这个

Function NewTextGet(ByVal RawText As String, ByVal StartString As String, ByVal EndStrings() As String) As List(Of String)
        Dim bEnd As List(Of String) = EndStrings.ToList
        bEnd.Insert(0, StartString)

        Dim Blocks As New List(Of String)
        Dim Splits() As String = Split(RawText, vbNewLine, , CompareMethod.Text)

        For x As Integer = 0 To Splits.Length - 1
1:
            Dim block As String = ""
            If Splits(x).Contains(StartString) Then
                block = Splits(x)
                For y As Integer = x + 1 To Splits.Length - 1
                    Dim BlockEnd As Boolean = False
                    For Each s As String In bEnd
                        If Splits(y).Contains(s) Then BlockEnd = True
                    Next
                    block &= vbNewLine
                    If BlockEnd Then
                        If Splits(y).Contains(StartString) Then
                            Blocks.Add(block & vbNewLine)
                            x = y - 1
                            GoTo 1
                        End If
                        x = y + 1
                        block &= Splits(y)
                        Blocks.Add(block & vbNewLine)
                        Exit For
                    End If
                    block &= Splits(y)
                Next
            End If
        Next

        Return Blocks
    End Function

用法

For Each s As String In NewTextGet(Raw, "ctxt", New String() {"sdone", "done", "prompt"})
    TextBox2.Text &= s & "=======" & vbNewLine
Next

使用此顺序 { "sdone", "done" , "prompt"} 以避免拆分时出现冲突


推荐阅读