【问题标题】:Finding Characters in vb.net string在 vb.net 字符串中查找字符
【发布时间】:2018-10-18 00:25:53
【问题描述】:

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

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 次后发现字符“[”,则字符串在消息框中显示相同 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

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

【问题讨论】:

  • 发布代码 sn-ps 时请考虑可读性。缩进比需要缩进六倍的代码无缘无故地降低了可读性。如果选择代码并单击 CODE 按钮六次太麻烦,请在选择代码时使用Alt,以便选择任意块。
  • 我不太确定你在问什么。如果您的意思是要在找到匹配项后退出循环,那么这正是您应该做的。至于确定从当前索引开始的子字符串,您必须知道当前索引是什么,如果您使用的是For Each 循环,则不知道。使用For 循环,然后您可以调用Substring 来测试多个字符。
  • 旁注:“Else 'Do nothing”。那又何苦呢?删除Else...
  • Exit ForMsgBox 之后怎么样?

标签: vb.net foreach substring indexof


【解决方案1】:

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

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

【讨论】:

  • 可能您还应该添加分隔符以查找子字符串的结尾。否则,文本块内的任何杂散 ] 将用于剪切返回值。当然,这需要重新计算要在子字符串中提取的字符的长度
  • @Steve 虽然您的评论是正确的,但我认为对于这种特定的输入格式,只需使用 ][ 作为结束分隔符就足够了。我已经编辑了我的答案以反映这一点。
  • @Steve 再三考虑,我还包含了更通用的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 2012-12-26
相关资源
最近更新 更多