我試圖在包含問號通配符的更大字串中查找文本子字串的位置。大字串是不精確的 OCR 軟體的結果,它包含通配符,因為它可以告訴那里有一個字符,但無法識別是哪個字符。
這是我想要完成的一個過于簡單的例子。
Dim resultIndex As Integer = -1
Dim LargeOcrText As String = "fAsD ?GjSDFpG HjDYA?C JLgD FHaYsV MKiI?oL XgXj?GN sHVKgG?"
Dim searchText As String = "ABC"
If searchText Like LargeOcrText Then resultIndex = LargeOcrText.IndexOf(searchText)
這應該回傳一個 resultIndex = 18,但它不起作用,即使我使用 searchText = "*ABC*" 代替。我幾乎可以肯定有一些方法可以使用正則運算式來進行 Like 比較,但是我對它們不是很熟悉,即使這樣我也完全不知道如何獲取子字串的索引。
編輯:明確地說,我知道 Like 和 IndexOf 都不支持我正在嘗試做的事情。這正是我的問題。我在尋找一些其他的方式,以它的代碼是不作業的。
uj5u.com熱心網友回復:
在您的搜索模式中,將每個字母替換為[<that letter>?]并將其提供給 Regex:
Dim resultIndex As Integer = -1
Dim LargeOcrText As String = "fAsD ?GjSDFpG HjDYA?C JLgD FHaYsV MKiI?oL XgXj?GN sHVKgG?"
Dim searchText As String = "[A?][B?][C?]"
With Regex.Match(LargeOcrText, searchText)
If .Success Then resultIndex = .Index
End With
uj5u.com熱心網友回復:
除了 GSerg 的回答之外,還可以[A?][B?][C?]從ABC.
這是一個作業代碼示例。
Imports System.Linq
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim largeOcrText As String = "fAsD ?GjSDFpG HjDYA?C JLgD FHaYsV MKiI?oL XgXj?GN sHVKgG?"
Dim searchText As String = "ABC"
Dim index As Integer = GetOcrIndex(largeOcrText, searchText)
Debug.WriteLine($"Index = {index}")
End Sub
Private Function GetOcrIndex(haystack As String, needle As String) As Integer
Dim pattern As String = BuildPattern(needle)
Debug.WriteLine($"Pattern = {pattern}")
Dim match As Match = Regex.Match(haystack, pattern, RegexOptions.IgnoreCase)
Return If(match.Success, match.Index, -1)
End Function
Private Function BuildPattern(needle As String) As String
Return String.Concat(needle.SelectMany(AddressOf AddWildcard))
End Function
Private Function AddWildcard(c As Char) As String
Return $"[{Regex.Escape(c)}?]"
End Function
End Module
輸出:
Pattern = [A?][B?][C?]
Index = 18
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/314902.html
