如何通过MultiSplit获取字符串位置与长度?RsultOfPostionAndLength使用疑问
问题与代码
我正在编写GetAllPosition子程序,但不清楚应在代码中何处使用RsultOfPostionAndLength以得到预期输出。
预期输出
- 当
MultiSplit为{"C", "B", "A"}时:55-5 '}666[' 61-5']777(' 67-3')8[' 71-6']hhhy(' - 当
MultiSplit为{"A", "B", "C"}时:27-6 ']1111{' 34-4'}22(' 39-7')33333{' 47-3'}4{' 51-3 '}5{' 55-5'}666[' 78-4')99{' 83-5'}999['
现有代码:
Dim RsultOfPostionAndLength As List(Of String) '格式为:字符串位置 和 匹配到的长度 ' 当MultiSplit为{"C", "B", "A"}时输出:55-5 '}666[' 61-5']777(' 67-3')8[' 71-6']hhhy(' ' 当MultiSplit为{"A", "B", "C"}时输出:27-6 ']1111{' 34-4'}22(' 39-7')33333{' 47-3'}4{' 51-3 '}5{' 55-5'}666[' 78-4')99{' 83-5'}999[' Sub Setup() Dim inString As String = "}666[]777([}666[]777(]00[A]1111{C}22(B)33333{C}4{C}5{C}666[A]777(B)8[A]hhhy(B)99{C}999[A]101010}666[]777(" Dim MultiSplit As String() = {"C", "B", "A"} GetAllPosition(1, inString.Length, inString, MultiSplit, 0) End Sub Sub GetAllPosition(LastIdx As Integer, LastLen As Integer, inString As String, MultiSplit As String(), Level As Integer) Dim spl As String() = Split(inString, ",") Dim body As String = Mid(inString, LastIdx, LastLen) 'Dim LastIdx As Integer = spl(0) Dim results As New List(Of String) Dim Find As String = MultiSplit(Level) Dim last As Integer = LastIdx Dim index As Integer = -1 Do Until body.Length <= index index = body.IndexOf(Find, index + 1) If index = -1 AndAlso body.Length > last Then index = body.Length End If Dim lenTexxt As Integer = Math.Abs(last - index) + 1 Dim part1 As String = Mid(body, last, lenTexxt) Dim part As String = Mid(inString, last, lenTexxt) Dim b As Boolean = MultiSplit.Skip(Level + 1).All(Function(c) part.IndexOf(c, comparisonType:=StringComparison.OrdinalIgnoreCase) > -1) If b Then results.Add(last & "," & lenTexxt & "," & part) End If last = index + 2 Loop Level += 1 For Each g In results Dim spl2 As String() = Split(g, ",") GetAllPosition(spl2(0), spl2(1), inString, MultiSplit, Level) Next End Sub
修改方案
要正确使用RsultOfPostionAndLength,需将它设为模块级变量,在递归终止条件(遍历完所有MultiSplit层级)时,把符合格式的结果添加进去。具体修改如下:
- 将
RsultOfPostionAndLength声明为模块级变量,确保递归过程中能持续收集结果。 - 在
Setup中每次运行前清空结果列表,避免残留旧数据。 - 在
GetAllPosition中添加终止判断:当遍历到最后一层MultiSplit时,将片段格式化为预期形式加入结果列表;未到最后一层则继续递归处理。
修改后的完整代码:
' 模块级变量,递归过程中持续收集结果 Dim RsultOfPostionAndLength As New List(Of String) '格式为:字符串位置 和 匹配到的长度 Sub Setup() Dim inString As String = "}666[]777([}666[]777(]00[A]1111{C}22(B)33333{C}4{C}5{C}666[A]777(B)8[A]hhhy(B)99{C}999[A]101010}666[]777(" Dim MultiSplit As String() = {"C", "B", "A"} ' 清空旧结果 RsultOfPostionAndLength.Clear() GetAllPosition(1, inString.Length, inString, MultiSplit, 0) ' 输出验证结果 For Each item In RsultOfPostionAndLength Debug.Print(item) Next End Sub Sub GetAllPosition(LastIdx As Integer, LastLen As Integer, inString As String, MultiSplit As String(), Level As Integer) Dim body As String = Mid(inString, LastIdx, LastLen) Dim results As New List(Of String) Dim Find As String = MultiSplit(Level) Dim last As Integer = LastIdx Dim index As Integer = -1 Do Until index >= body.Length - 1 index = body.IndexOf(Find, index + 1) If index = -1 Then index = body.Length Dim lenText As Integer = index - (last - LastIdx) + 1 Dim part As String = Mid(inString, last, lenText) ' 检查是否满足后续层级要求 Dim meetsRequirements As Boolean = True If Level < MultiSplit.Length - 1 Then meetsRequirements = MultiSplit.Skip(Level + 1).All(Function(c) part.IndexOf(c, StringComparison.OrdinalIgnoreCase) > -1) End If If meetsRequirements Then If Level = MultiSplit.Length - 1 Then ' 到达最后一层,写入结果 RsultOfPostionAndLength.Add($"{last}-{lenText} '{part}'") Else ' 未到最后一层,继续递归 results.Add(last & "," & lenText) End If End If last = last + lenText + 1 Loop ' 递归处理下一层级 Level += 1 For Each g In results Dim spl2 As String() = Split(g, ",") GetAllPosition(CInt(spl2(0)), CInt(spl2(1)), inString, MultiSplit, Level) Next End Sub
关键说明
- 模块级变量
RsultOfPostionAndLength保证所有递归分支的结果能被统一收集。 - 仅当遍历完所有
MultiSplit层级时,才将结果按预期格式写入列表,确保输出符合要求。 - 调整了片段长度计算逻辑,修正了原代码中位置和长度的偏差问题。
内容的提问来源于stack exchange,提问作者Mansour Dalir
相关产品推荐
相关产品推荐

