4

プレースホルダーを実際の値に置き換えるために解析するプレースホルダーを含むテキスト テンプレートがあります。

テキスト テンプレート:

Name:%name%
Age:%age%

StringBuilder.Replace() を使用してプレースホルダーを置き換えます

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

今はもっと高度なアルゴリズムを作りたいと思っています。コードの一部の行は条件付きです。それらは完全に削除するか、保持する必要があります。

テキスト テンプレート

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

行 Employer は、人が雇用されている場合にのみ表示されます (ブール変数 Person.IsEmployed によって制御されます)。

更新:開始/終了タグを使用できます。文字列 A と B の間のテキストを見つけるにはどうすればよいですか? 正規表現を使用できますか? どのように?

4

4 に答える 4

4

おそらく、テンプレートの代わりに、置換テキストに「Employer:」というラベルを含めることができます。

テンプレート:

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

置換

sb.Replace("%employer%", 
    string.IsNullOrEmpty(Person.Employer) ? "" : "Employer: " + Person.Employer)
于 2010-03-07T08:28:59.440 に答える
2

もう 1 つの方法は、SparkNVelocityなどのテンプレート エンジンを使用することです。

ここでSparkの簡単な例を参照してください

本格的なテンプレート エンジンを使用すると、書式設定された出力を最大限に制御できます。たとえば、条件と繰り返しセクション。

于 2010-03-07T08:40:07.640 に答える
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
}

しかし、実際には、この実装には穴がたくさんあります...別の回答が提案されているようなテンプレートフレームワークを使用したほうがよい場合があります。

于 2010-03-07T08:50:16.777 に答える
1

1つのオプションは、現在行っているようにすべての置換を行い、空の変数をRegEx置換で修正してドアを出る方法です。このようなもの:

Response.Write(RegEx.Replace(sb.ToString(), "\r\n[^:]+:r\n", "\r\n"));
于 2010-03-07T08:35:18.603 に答える