vb.net string - 有效替换占位符令牌

时间:2013-08-19 18:03:36

标签: vb.net string replace contentplaceholder

我只是想找一些有点问题的想法。我有一个字符串,它是消息的模板,例如:

Dear [[Guest.FirstName]],

We hope your are looking forward to your holiday in [[Booking.ResortName]]

我当前用于替换spaceholder标记的系统(例如[[Guest.FirstName]])是非常低效的,循环内部存在循环并且需要太长时间。

我正在寻找的是一种通过字符串的方式,直到找到[[something]],然后用它的真实值替换[[something]],然后继续通过字符串。

请注意替换[[something]]然后我需要访问空间持有者(即我需要知道它是[[Guest.FirstName]]还是[[Booking.ResortName]])。

任何有效实现这一目标的建议都会非常受欢迎,我觉得它应该相当简单,但我能想到的一切最终都会在循环中循环。

谢谢!

菲尔。

1 个答案:

答案 0 :(得分:1)

有很多因素会影响表现,所以很难说,如果不了解所有细节,哪种方法最有效。但是,在编码简单性方面,使用RegEx MatchEvaluator将是一个很好的选择。我相信你会同意它比你现在使用的更清洁:

Public Function ReplacePlaceholders(data As String) As String
    Dim r As New Regex("\[\[(?<placeholder>.*?)\]\]")
    data = r.Replace(data, New MatchEvaluator(AddressOf PlaceHolderReplacementEvaluator))
End Function

Private Function PlaceHolderReplacementEvaluator(match As Match) As String
    Dim name As String = match.Groups("placeholder").Value
    Return LookUpValueByPlaceholderName(name)   ' Replace with value lookup logic here
End Function

如果数据中的占位符总数相当小,并且可能的占位符列表很小,那么最好只列出它们的值并将其替换为这样:

Public Function ReplacePlaceholders(data As String) As String
    Dim placeHolders As Dictionary(Of String, String) = LoadPlaceHolders()
    For Each i As KeyValuePair(Of String, String) In placeHolders
        data = data.Replace(i.Key, i.Value)
    Next
    Return data
End Function

Private Function LoadPlaceHolders() As Dictionary(Of String, String)
    Dim placeholders As New Dictionary(Of String, String)
    ' Load data here
    Return placeholders
End Function

如果您真的想要最有效的解决方案,那么逐个字符地追加,随意添加到StringBuilder或输出Stream,这将是您的最佳选择。它不会很漂亮,但是如果你发布你所拥有的CodeReview,可能会有一些人能找到让它稍微不那么丑陋的方法:)