You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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层级)时,把符合格式的结果添加进去。具体修改如下:

  1. 将RsultOfPostionAndLength声明为模块级变量,确保递归过程中能持续收集结果。
  2. 在Setup中每次运行前清空结果列表,避免残留旧数据。
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:35:55