2013-02-22 83 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