簡體   English   中英

匹配“ THIS”並替換為“ THAT” RegEx Vb.Net

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM