vb.net - 在多个分隔符之间拆分文本
问题描述
我正在进行的项目有一个相当棘手的问题。我非常需要从更大的字符串中提取多个分隔符之间的特定字符串。为了让您更好地理解,我的意思是,这里有一个例子:
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 :)
解决方案
尝试这个
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"} 以避免拆分时出现冲突
推荐阅读
- c# - 如何将以下用于使用 EF 6 进行数据库连接的代码转换为 C# 中的异步任务?
- corda - 我想在corda中同时搜索和寻呼
- bash - 如果下一行不以 `>` 开头,则删除新行
- java - 在使用 JNI 将 c++ unordered_map 返回到 java 之前将其转换为 java hashMap
- c# - 我可以用 php/nodejs 与 SignalR api 交谈吗
- c++ - 为什么 int8_t 的输出格式使用 4 个字节?
- java - 无法解析 Java 8 中的构造函数
- javascript - 如何根据链接到本地存储的数组中的更改调用函数
- c# - 用c#插入sqlite
- c# - 将 Python 烧瓶脚本与 Asp.Net Web 表单应用程序、C#、