0

テキストを見つけて対応する値に置き換える方法を見つけようとしています。

例えば

1) フェデックスからフェデックスへ 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 に一致させる方法がわかりません。

4

2 に答える 2

1

ここで正規表現が必要なのは IgnoreCase オプションだけだと思います。もしそうなら、正規表現をまったく使用しないことをお勧めします。代わりに 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)

しかし、それでも正規表現が必要な場合は、これでうまくいくはずです:

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
于 2013-02-22T11:46:40.953 に答える
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
于 2013-02-23T11:42:54.497 に答える