匹配“这个”并替换为“那个”RegEx Vb.Net

时间:2013-02-22 10:46:16

标签: regex vb.net

尝试找出如何使用相应的值查找和替换文本。

例如

1)联邦快递到联邦快递 2)美国宇航局到美国宇航局 3)po box to 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。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

通过使用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