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
相关产品推荐
相关产品推荐

