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

VB.NET字符串字符查找问题:MsgBox重复显示相同内容

解决VB.NET重复弹窗问题的方案

先帮你理清问题的根源:
你的代码是遍历DeltaString中的每一个字符,每遇到一个"["就会执行一次从TB8提取内容的逻辑,而且每次提取的都是TB8里第一个[B|到对应]之间的内容——这就导致只要DeltaString里有X个"[",就会重复执行X次完全相同的提取操作,自然弹出X次一模一样的消息框。

下面根据你的实际需求,给出两种针对性的解决办法:

场景1:只需要提取一次TB8中的[B|内容

如果你的需求是「只要DeltaString里存在至少一个"[",就提取一次TB8里的[B|内容」,那完全不需要遍历每个字符,直接检查是否存在"["后执行一次提取即可,还能避免不必要的循环:

If DeltaString.Contains("[") Then
    Dim DeltaIndexB As Integer = TB8.IndexOf("[B|")
    ' 增加边界检查,避免找不到[B|或对应]时抛出异常
    If DeltaIndexB <> -1 Then
        Dim closeBracketIndex As Integer = TB8.IndexOf("]", DeltaIndexB + 1)
        If closeBracketIndex <> -1 Then
            Dim DeltaStringB As String = TB8.Substring(DeltaIndexB + 3, closeBracketIndex - DeltaIndexB - 3)
            MsgBox(DeltaStringB)
        End If
    End If
End If

如果你一定要保留循环(比如循环里还有其他未展示的逻辑),那找到第一个"["后就退出循环,阻止重复执行:

For Each DeltaCharB As Char In DeltaString
    If DeltaCharB = "[" Then
        Dim DeltaIndexB As Integer = TB8.IndexOf("[B|")
        If DeltaIndexB <> -1 Then
            Dim closeBracketIndex As Integer = TB8.IndexOf("]", DeltaIndexB + 1)
            If closeBracketIndex <> -1 Then
                Dim DeltaStringB As String = TB8.Substring(DeltaIndexB + 3, closeBracketIndex - DeltaIndexB - 3)
                MsgBox(DeltaStringB)
            End If
        End If
        Exit For ' 找到第一个[后立即退出循环,避免重复弹窗
    End If
Next

场景2:需要匹配DeltaString中的每个[到TB8中对应的[B|内容

如果你的需求是DeltaString里的每个"["对应TB8里的一个[B|...]块(比如第1个[对应第1个[B|,第2个[对应第2个[B|),那需要先把TB8里所有符合格式的内容收集起来,再逐个匹配弹窗:

' 第一步:收集TB8中所有[B|...]格式的内容
Dim tb8ContentList As New List(Of String)()
Dim currentSearchIndex As Integer = 0

Do
    ' 找下一个[B|的位置
    Dim openTagPos As Integer = TB8.IndexOf("[B|", currentSearchIndex)
    If openTagPos = -1 Then Exit Do ' 没有更多匹配项,退出循环
    
    ' 找对应]的位置
    Dim closeTagPos As Integer = TB8.IndexOf("]", openTagPos + 1)
    If closeTagPos = -1 Then Exit Do ' 找不到对应],退出避免报错
    
    ' 提取中间内容并加入列表
    tb8ContentList.Add(TB8.Substring(openTagPos + 3, closeTagPos - openTagPos - 3))
    
    ' 更新搜索起始位置,继续找下一个匹配项
    currentSearchIndex = closeTagPos + 1
Loop

' 第二步:遍历DeltaString的[,逐个弹出对应内容
Dim contentIndex As Integer = 0
For Each DeltaCharB As Char In DeltaString
    If DeltaCharB = "[" AndAlso contentIndex < tb8ContentList.Count Then
        MsgBox(tb8ContentList(contentIndex))
        contentIndex += 1 ' 移动到下一个内容,避免重复弹出同一条
    End If
Next

这段代码会先把TB8里所有符合[B|...]格式的内容都提取出来存到列表里,然后遍历DeltaString的每个[,依次弹出列表里的对应内容——既不会重复弹窗,也能保证内容和[的数量对应(如果TB8里的内容足够多的话)。

额外提示:原来的代码没有做边界检查,如果TB8里找不到[B|或者对应的],会抛出ArgumentOutOfRangeException,上面的所有方案都加了检查,能避免这种异常。

内容的提问来源于stack exchange,提问作者LabRat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:08:40