2010-03-07 88 views
4

我有一個文本模板,帶有placehoders,我解析爲了用實際值替換佔位符 。文本解析,條件文本

文本模板:

Name:%name% 
Age:%age% 

我用StringBuilder.Replace()來替換佔位符

sb.Replace("%name%", Person.Name); 

現在我想進行更高級的算法。一些代碼行是有條件的。他們 必須被完全刪除保存。

文本模板

Name:%Name% 
Age:%age% 
Employer:%employer% 

線僱主應出現只有當人採用(由布爾變量Person.IsEmployed控制)。

更新:我可以使用打開/關閉標記。如何在字符串A和B之間找到文本? 我可以使用Regex嗎?怎麼樣?

回答

1

您當前的模板方案是不是足夠強大 - 你應該增加更多的特殊佔位符,像這樣的例子:

Name:%Name% 
Age:%age% 
[if IsEmployed] 
Employer:%employer% 
[/if] 

您可以分析出[IF *]使用正則表達式(未測試)塊:

Match[] ifblocks = Regex.Match(input, "\\[if ([a-zA-Z0-9]+)\\]([^\\[]*)\\[/if\\]"); 
foreach(Match m in ifblocks) { 
    string originalBlockText = m.Groups[0]; 
    string propertyToCheck = m.Groups[1]; 
    string templateString = m.Groups[2]; 

    // check the property that corresponds to the keyword, i.e. "IsEmployed" 

    // if it's true, do the normal replacement on the templateString 
    // and then replace the originalBlockText with the "filled" templateString 

    // else, just don't write anything out 
} 

真的,但是,這種實現千瘡百孔......你可能是一個模板框架更好像另一個答案建議。

4

也許你可以包括標籤 「僱主:」 在替換文本,而不是模板:

模板:

Name:%Name% 
Age:%age% 
%employer% 

更換

sb.Replace("%employer%", 
    string.IsNullOrEmpty(Person.Employer) ? "" : "Employer: " + Person.Employer) 
+0

如何設置標籤僅與文本的特定區域相關? 我想我需要引入開啓/關閉標籤。 – 2010-03-07 08:41:24

1

一種選擇是做您現在正在進行的所有替換,然後在出門時用RegEx替換修正空變量。事情是這樣的:

Response.Write(RegEx.Replace(sb.ToString(), "\r\n[^:]+:r\n", "\r\n")); 
2

另一種方法是使用模板引擎,例如SparkNVelocity

見一個簡單的例子爲Spark here

一個成熟的模板引擎應該給你在格式化輸出的最大控制。例如條件和重複部分。