たとえば、いくつかの「トークン化された」テンプレートがあります(トークンを二重中括弧の間の部分と呼びます)。
var template1 = "{{TOKEN1}} is a {{TOKEN2}} and it has some {{TOKEN3}}";
次のようなものにするために、この文から配列を抽出したいと思います。
Array("{{TOKEN1}}",
" is a ",
"{{TOKEN2}}",
" and it has some ",
"{{TOKEN3}}");
私は次の正規表現コードでそれを達成しようとしました:
Regex r = new Regex(@"({{[^\}]*}})");
var n = r.Split(template1);
そして結果は次のとおりです。
Array("",
"{{TOKEN1}}",
" is a ",
"{{TOKEN2}}",
" and it has some ",
"{{TOKEN3}}",
"");
最初の問題は、文からトークンを回復できなかったことです。なぜこれが解決されるのかはわかりませんが、正規表現に括弧を追加するだけでこれを解決しました。
私が現在直面している問題は、テンプレートの最初および/または最後の用語が「トークン」である場合に、配列の最初および/または最後に余分な空の用語があることです。なぜそれが起こっているのですか?私は何か間違ったことをしているのでしょうか、それともこれら2つのポジションの空虚さを常にチェックする必要がありますか?
私のコードでは、どの用語がトークンに由来し、どの用語がテンプレートの固定位置であったかを知る必要があります。このソリューションでは、「{{」で始まり「}}」で終わる文字列のすべての配列の位置を確認する必要がありますが、これは最善の可能性ではないと思います。だから、誰かがこれらのものをバラバラにするためのより良い解決策を思いついたら、私は知ってうれしいです!
ありがとうございました!
編集:要求に応じて、トークンとテキストでこの区別が必要な理由の簡単な例を投稿します。
public abstract class TextParts { }
public class TextToken : TextParts { }
public class TextConstant : TextParts { }
var list = new List<TextParts>();
list.Add( new TextToken("{{TOKEN1}}") );
list.Add( new TextConstant(" is a ") );
list.Add( new TextToken("{{TOKEN2}}") );
/* and so on */
このようにして、文字列を構成する部分のリストを作成し、それをデータベースに記録して、将来の操作や置換を可能にします。実際、このトークンはそれぞれ正規表現文字列に置き換えられます。
目的は、ユーザーが「{{SERVER}}はポート{{PORT}}でリッスンしていません」などのメッセージを入力できるようにすることです。また、「{{SERVER}}」を[a-zA-Z0-9 ]+
「{{ PORT}}"から\d{1,5}
。意味がありますか?
これにより、投稿がより明確になることを願っています。