2013-08-19 183 views
2

我只是在尋找一些有點問題的想法。我有一個字符串,它是一個消息的模板,例如:vb.net字符串 - 有效替換佔位符標記

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]])。

任何有效的方法來實現這一點的建議將非常感激,我覺得它應該是相當直接的,但我能想到的一切都以循環內循環再次結束。

謝謝!

Phil。

+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,可能有些人可能會找到讓它稍微難看的方法:)

+1

謝謝你現在工作得很好。 Incase對我的主要問題是針對Mac的人有所幫助,我有一個silverlight項目,Macs運行得非常慢。主要的罪犯是string.replace,由於某種原因,這是非常緩慢的Mac(但罰款在電腦上)。 Mac上的Regex.replace速度要快得多。 –