2013-02-22 84 views
0

試圖找出如何找到並用相應的值替換文本。匹配「THIS」並替換爲「THAT」RegEx Vb.Net

對於實施例

1)聯邦快遞到FedEx 2)美國宇航局NASA 3)郵政信箱到PO BOX

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的附加值。

+0

如何在運行時在代碼中添加值? – Jodrell 2013-02-22 11:12:20

回答

0

使用列表中找到解決方案,並做了性能測試反對字典對象建議由安東Kedrov兩種方法需要幾乎相同的時間來完成,但我不知道字典的方法將是好或不是更長的替換名單,因爲我t遍歷所有列表以找到替換的匹配條目。

謝謝大家的建議和意見。

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 
1

我猜,這裏唯一需要Regex的是IgnoreCase選項。如果是這樣,那麼我想建議不要使用正則表達式。使用字符串的功能,而不是:

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) 

但是,如果你仍然需要正則表達式,那麼這應該工作:

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 
+0

第1部分和第2部分唯一的區別是第1部分會降低整個輸入(我猜這可能是可以接受的)。第2部分的要點是要表明,不需要使用MathcEvaluator和命名組。 – 2013-02-22 12:39:30

+0

但仍然是,因爲您沒有使用正則表達式,所以您的替換可能不會由「」「'前綴。 – Jodrell 2013-02-22 14:04:33

+0

我認爲你誤解了這裏的'''' - 它實際上沒有任何意義,它只是一個被捕獲的組名。這種特殊情況下不需要命名組。 – 2013-02-22 18:28:49