在vb.net字符串中查找字符

在vb.net字符串中查找字符,vb.net,foreach,substring,indexof,Vb.net,Foreach,Substring,Indexof,我有一个关于以下代码的堆栈溢出问题: For Each DeltaCharB As Char In DeltaString If DeltaCharB = "[" Then Dim DeltaIndexB As Integer = TB8.IndexOf("[B|") Dim DeltaStringB As String = TB8.Substring(DeltaIndexB + 3, TB8.IndexOf("]", DeltaIndexB + 1) -

我有一个关于以下代码的堆栈溢出问题:

For Each DeltaCharB As Char In DeltaString
    If DeltaCharB = "[" Then
        Dim DeltaIndexB As Integer = TB8.IndexOf("[B|")
        Dim DeltaStringB As String = TB8.Substring(DeltaIndexB + 3, TB8.IndexOf("]", DeltaIndexB + 1) - DeltaIndexB - 3)
        MsgBox(DeltaStringB)
    Else
        'Do nothing
    End If
Next
产生的问题是,如果代码运行X次,找到字符“[”时,字符串在messagebox中显示X次

但是,我只想处理1X。我已尝试更改以下行,但正如我预期的那样,一次只允许一个字符

If DeltaCharB = "[B|" Then
通常,用于搜索的字符串如下所示:

{[A|Text belonging to entry A][B|Text belonging to entry B][C|Text belonging to entry C]}.... ect...ect

有人知道如何解决这个问题吗?

为什么需要循环?您的分隔符定义得很好,您可以这样做:

Function GetContent(byval input as string, byval delimiter as string) as string
    Dim fullDelimiter = "["& delimiter &"|"
    Dim BeginPosition as Integer = input.IndexOf(fullDelimiter)
    if BeginPosition > -1 then
        BeginPosition += fullDelimiter.Length
        Dim EndPosition = input.IndexOf("][", BeginPosition)
        if EndPosition > -1 then
            return input.SubString(BeginPosition, EndPosition - BeginPosition)
        end if
    end if
    return ""
End Function
以及用法:

Dim s as string = "[A|Text belonging to entry A][B|Text belonging to entry B][C|Text belonging to entry C]"

Dim content = GetContent(s, "B")
内容现在包含“属于条目B的文本”

请注意,使用此代码,分隔符可以由
[
|
之间任意长度的字符串组成

适合任何输入格式的更通用的解决方案意味着也接受函数中的结束分隔符:

Function GetContent(byval input as string, byval FromDelimiter as string, byval ToDelimiter as string) as string
    Dim BeginPosition as Integer = input.IndexOf(FromDelimiter)
    if BeginPosition > -1 then
        BeginPosition += FromDelimiter.Length
        Dim EndPosition = input.IndexOf(ToDelimiter, BeginPosition)
        if EndPosition > -1 then
            return input.SubString(BeginPosition, EndPosition - BeginPosition)
        end if
    end if
    return ""
End Function

为什么需要循环?您的分隔符定义得很好,您可以这样做:

Function GetContent(byval input as string, byval delimiter as string) as string
    Dim fullDelimiter = "["& delimiter &"|"
    Dim BeginPosition as Integer = input.IndexOf(fullDelimiter)
    if BeginPosition > -1 then
        BeginPosition += fullDelimiter.Length
        Dim EndPosition = input.IndexOf("][", BeginPosition)
        if EndPosition > -1 then
            return input.SubString(BeginPosition, EndPosition - BeginPosition)
        end if
    end if
    return ""
End Function
以及用法:

Dim s as string = "[A|Text belonging to entry A][B|Text belonging to entry B][C|Text belonging to entry C]"

Dim content = GetContent(s, "B")
内容现在包含“属于条目B的文本”

请注意,使用此代码,分隔符可以由
[
|
之间任意长度的字符串组成

适合任何输入格式的更通用的解决方案意味着也接受函数中的结束分隔符:

Function GetContent(byval input as string, byval FromDelimiter as string, byval ToDelimiter as string) as string
    Dim BeginPosition as Integer = input.IndexOf(FromDelimiter)
    if BeginPosition > -1 then
        BeginPosition += FromDelimiter.Length
        Dim EndPosition = input.IndexOf(ToDelimiter, BeginPosition)
        if EndPosition > -1 then
            return input.SubString(BeginPosition, EndPosition - BeginPosition)
        end if
    end if
    return ""
End Function

在发布代码片段时,请考虑可读性。缩进超过需要缩进六倍的代码可读性较差,这是没有充分理由的。如果选择代码并单击“代码”按钮六次太麻烦,请在选择代码时使用
Alt
,以便可以选择任意块。我不确定是什么原因你在问。如果你的意思是你想在找到匹配项后退出循环,那么这正是你应该做的。至于确定什么子字符串从当前索引开始,你必须知道当前索引是什么,如果你对每个循环都使用
,你就不知道。对
循环使用
,然后你可以调用
Sub字符串
以测试多个字符。旁注:“
否则”不执行任何操作
”。那又何必麻烦呢?放下
Else
…在
MsgBox
之后退出
怎么样?发布代码片段时,请考虑可读性。缩进超过需要缩进六倍的代码可读性较差,没有充分的理由。如果选择代码并单击代码按钮六次太麻烦,请使用
Alt
在选择代码时可以选择任意块。我不确定你在问什么。如果你的意思是你想在找到匹配项后退出循环,那么这正是你应该做的。至于确定哪个子字符串从当前索引开始,你必须知道当前索引是什么,你需要知道如果对每个
循环使用
,则不会启用。对
循环使用
,然后可以调用
子字符串
,以测试多个字符。旁注:“
否则”不执行任何操作
”。那么何必麻烦呢?删除
Else
…在
MsgBox
之后退出
怎么样?可能您还应该添加分隔符以查找子字符串的结尾。否则,任何错误都将被删除]文本块内部将用于剪裁返回值。当然,这将需要重新计算要在substring@Steve虽然您的评论是正确的,但我认为对于这种特定的输入格式,只需使用
][
作为结束分隔符。我编辑了我的答案以反映这一点。@Steve仔细考虑后,我还包括了更通用的函数。可能您还应该添加分隔符以查找子字符串的结尾。否则,任何错误]文本块内部将用于剪裁返回值。当然,这将需要重新计算要在substring@Steve虽然您的评论是正确的,但我认为对于这种特定的输入格式,只需使用
][
作为结尾分隔符。我编辑了我的答案以反映这一点。@Steve仔细想想,我还包括了更一般的函数。