[英]Match “THIS” And Replace with “THAT” RegEx Vb.Net
試圖找出如何查找和替換具有相應值的文本。
例如
1)將聯邦快遞(Fedex)運送至FedEx(聯邦快遞)2)將美國國家航空航天局(NASA)運送至美國國家航空航天局(NASA)3)將郵政信箱發送至郵政信箱
Public Function FindReplace(ByVal s As String) As String
Dim MatchEval As New MatchEvaluator(AddressOf RegexReplace)
Dim Pattern As String = "(?<f1>fedex|nasa|po box)"
Return Regex.Replace(s, Pattern, MatchEval, RegexOptions.IgnoreCase)
End Function
Public Function RegexReplace(ByVal m As Match) As String
Select Case LCase(m.Groups("f1").Value)
Case "fedex"
Return "FedEx"
Case "nasa"
Return "NASA"
Case "po box"
Return "PO BOX"
End Select
End Function
上面的代碼適用於固定值,但不知道如何使用上面的代碼在運行時(如db到Db)匹配添加的值。
我猜想,這里唯一需要Regex的是IgnoreCase選項。 如果是這樣,那么我建議完全不要使用Regex。 改用String功能:
Dim input As String = "fEDeX"
Dim pattern As String = "fedex"
Dim replacement As String = "FedEx"
Dim result As String
result = input.ToLowerInvariant().Replace(pattern, replacement)
但是,如果您仍然需要Regex,則應該可以使用:
result = Regex.Replace(input, pattern, replacement, RegexOptions.IgnoreCase)
例:
Sub Main()
Dim replacements As New Dictionary(Of String, String)()
replacements.Add("fedex", "FedEx")
replacements.Add("nasa", "NASA")
replacements.Add("po box", "PO BOX")
Dim result As String = Replace("fedex, nAsA, po box, etc", replacements)
End Sub
Private Function Replace(ByVal input As String, ByVal replacements As Dictionary(Of String, String)) As String
For Each item In replacements
input = Regex.Replace(input, item.Key, item.Value, RegexOptions.IgnoreCase)
Next
Return input
End Function
通過使用List找到了解決方案,並對Anton Kedrov建議的字典對象進行了性能測試,兩種方法幾乎都需要花費相同的時間才能完成,但是我不知道字典方法是否適合較長的替換列表,因為它遍歷所有列表中找到要替換的匹配項。
我感謝大家的建議。
Sub Main()
Dim lst As New List(Of String)
lst.Add("NASA")
lst.Add("FedEx")
lst.Add("PO BOX")
MsgBox(FindReplace("this is testing fedex naSa PO box"))
End Sub
Public Function FindReplace(ByVal s As String) As String
Dim Pattern As String = "(?<f1>fedex|nasa|po box)"
Dim MatchEval As New MatchEvaluator(AddressOf RegexReplace)
Return Regex.Replace(s, Pattern, MatchEval, RegexOptions.IgnoreCase)
End Function
Public Function RegexReplace(ByVal m As Match) As String
Dim Found As String
Found = lst.Find(Function(value As String) LCase(value) = LCase(m.Groups("f1").Value))
Return Found
End Function
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.