由于您可以将开始位置传递给IndexOf
方法,因此您可以通过从上次迭代停止的位置开始搜索来循环字符串。例如:
Dim getLiteratura As String = "'Author 1. Name of book 1. ISBN 978-80-251-2025-5.', 'Author 2. Name of Book 2. ISBN 80-01-01346.', 'Author 3. Name of book. ISBN 80-85849-83.'"
Dim isbns As New List(Of String)()
Dim position As Integer = 0
While position <> -1
position = getLiteratura.IndexOf("ISBN", position)
If position <> -1 Then
Dim endPosition As Integer = getLiteratura.IndexOf(".", position + 1)
If endPosition <> -1 Then
isbns.Add(getLiteratura.Substring(position + 5, endPosition - position - 5))
End If
position = endPosition
End If
End While
如果数据已经全部加载到字符串中,那将与您可能找到的方法一样有效。但是,该方法的可读性或灵活性不高。如果这些事情不仅仅关注效率,您可能需要考虑使用 RegEx:
For Each i As Match In Regex.Matches(getLiteratura, "ISBN (?<isbn>.*?)\.")
isbns.Add(i.Groups("isbn").Value)
Next
如您所见,它不仅更易于阅读,而且还可以配置。您可以将模式外部存储在资源、配置文件、数据库等中。
如果数据还没有全部加载到字符串中,并且效率是最重要的问题,您可能需要考虑使用流读取器,以便一次只将一小部分数据加载到内存中。这个逻辑会有点复杂,但仍然不会太难。
这是一个简单的示例,说明如何通过 a 进行操作StreamReader
:
Dim isbns As New List(Of String)()
Using reader As StreamReader = New StreamReader(stream)
Dim builder As New StringBuilder()
Dim isbnRegEx As New Regex("ISBN (?<isbn>.*?)\.")
While Not reader.EndOfStream
Dim charValue As Integer = reader.Read()
If charValue <> -1 Then
builder.Append(Convert.ToChar(charValue))
Dim matches As MatchCollection = isbnRegEx.Matches(builder.ToString())
If matches.Count <> 0 Then
For Each i As Match In matches
isbns.Add(i.Groups("isbn").Value)
Next
builder.Clear()
End If
End If
End While
End Using
如您所见,在该示例中,一旦找到匹配项,它就会将其添加到列表中,然后清除builder
用作缓冲区的匹配项。这样,一次保存在内存中的数据量永远不会超过一个“记录”的大小。
更新
由于根据您的评论,您无法使其正常工作,因此这是一个完整的工作示例,它仅输出ISBN 编号,没有任何周围的字符。只需创建一个新的 VB.NET 控制台应用程序并粘贴以下代码:
Imports System.Text.RegularExpressions
Module Module1
Public Sub Main()
Dim data As String = "'Author 1. Name of book 1. ISBN 978-80-251-2025-5.', 'Author 2. Name of Book 2. ISBN 80-01-01346.', 'Author 3. Name of book. ISBN 80-85849-83.'"
For Each i As String In GetIsbns(data)
Console.WriteLine(i)
Next
Console.ReadKey()
End Sub
Public Function GetIsbns(data As String) As List(Of String)
Dim isbns As New List(Of String)()
For Each i As Match In Regex.Matches(data, "ISBN (?<isbn>.*?)\.")
isbns.Add(i.Groups("isbn").Value)
Next
Return isbns
End Function
End Module