我设法找到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))
答案 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)
但问题是,只有当source
和closer
不是特殊的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