如何读取2个其他字符串之间的所有字符串

时间:2013-09-27 11:59:14

标签: vb.net split

我设法找到2个指定字符串之间的字符串, 现在唯一的问题是它只会找到一个然后停止。

我怎样才能抓住文本框中的所有字符串? 文本框是多行的,我已经在其中添加了一个litle配置。

现在我希望列表框将添加我指定的2个字符串之间的所有字符串。

textbox3.text包含“<” 和textbox 4.text包含“>”

Public Function GetClosedText(ByVal source As String, ByVal opener As String, ByVal closer As String) As String
    Dim intStart As Integer = InStr(source, opener)
    If intStart > 0 Then
        Dim intStop As Integer = InStr(intStart + Len(opener), source, closer)
        If intStop > 0 Then
            Try
                Dim value As String = source.Substring(intStart + Len(opener) - 1, intStop - intStart - Len(opener))
                Return value
            Catch ex As Exception
                Return ""
            End Try
        End If
    End If
    Return ""
End Function


usage:
ListBox1.Items.Add(GetClosedText(TextBox1.Text, TextBox3.Text, TextBox4.Text))

2 个答案:

答案 0 :(得分:3)

执行此操作的最简单方法(最少代码行)是使用正则表达式。例如,要查找括在尖括号中的所有字符串,可以使用此正则表达式:

\<(?<value>.*?)\>

这就是所有意思:

  • \< - 查找以<字符开头的字符串。由于<在RegEx中具有特殊含义,因此必须对其进行转义(即以反斜杠开头)
  • (?<value>xxx) - 这会创建一个命名组,以便我们以后可以通过名称"value"访问匹配字符串的这一部分。名称组中包含的所有内容(即xxx所在的位置)都被视为该组的一部分。
  • .*? - 这意味着可以找到任意数量的任何字符,但不包括下一个字符。 .是一个通配符,表示任何字符。 *表示任意次数。 ?使其非贪婪,因此只要找到接下来的内容(结束>)就会停止匹配。
  • \> - 指定匹配的字符串必须以>字符结尾。由于>在RegEx中具有特殊含义,因此也必须对其进行转义。

您可以使用该RegEx表达式查找所有匹配项,如下所示:

Dim items As New List(Of String)()
For Each i As Match In Regex.Matches(source, "\<(?<value>.*?)\>")
    items.Add(i.Groups("value").Value)
Next

在您的场景中使其工作的技巧是您需要动态指定开始和结束字符。您可以通过将它们连接到RegEx来实现,如下所示:

Regex.Matches(source, opener & "(?<value>.*?)" & closer)

但问题是,只有当sourcecloser不是特殊的RegEx字符时才会有效。在您的示例中,它们是<>,它们是特殊字符,因此需要对其进行转义。安全的方法是使用Regex.Escape方法,只有在需要时才转义字符串:

Private Function GetClosedText(source As String, opener As String, closer As String) As String()
    Dim items As New List(Of String)()
    For Each i As Match In Regex.Matches(source, Regex.Escape(opener) & "(?<value>.*?)" & Regex.Escape(closer))
        items.Add(i.Groups("value").Value)
    Next
    Return items.ToArray()
End Function

请注意,在上面的示例中,我更改了GetClosedText函数而不是查找单个项并返回它,而是返回一个字符串数组。所以现在,你可以这样称呼它:

ListBox1.Items.AddRange(GetClosedText(TextBox1.Text, TextBox3.Text, TextBox4.Text))

答案 1 :(得分:1)

我认为你想循环所有的开场白和闭门器:

' always use meaningful variable/control names instead of
If TextBox3.Lines.Length <> TextBox4.Lines.Length Then 
    MessageBox.Show("Please provide the same count of openers and closers!")
    Return
End If

Dim longText = TextBox1.Text
For i As Int32 = 0 To TextBox3.Lines.Length - 1
    Dim opener = TextBox3.Lines(i)
    Dim closer = TextBox4.Lines(i)
    listBox1.Items.Add(GetClosedText(longText, opener , closer))
Next

但是,您应该使用如here所示的.NET方法:

Public Function GetClosedText(ByVal source As String, ByVal opener As String, ByVal closer As String) As String
    Dim indexOfOpener = source.IndexOf(opener)
    Dim result As String = ""
    If indexOfOpener >= 0 Then ' default is -1 and indices start with 0
        indexOfOpener += opener.Length ' now look behind the opener
        Dim indexOfCloser = source.IndexOf(closer, indexOfOpener)
        If indexOfCloser >= 0 Then
            result = source.Substring(indexOfOpener, indexOfCloser - indexOfOpener)
        Else
            result = source.Substring(indexOfOpener) ' takes the rest behind the opener
        End If
    End If
    Return result
End Function