9

たとえば、いくつかの「トークン化された」テンプレートがあります(トークンを二重中括弧の間の部分と呼びます)。

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}。意味がありますか?

これにより、投稿がより明確になることを願っています。

4

2 に答える 2

5

文字列を区切り記号で分割し、文字列が区切り記号で開始または終了する場合、最初/最後の区切り記号の前後に空の要素があることを意味します。

CSV ファイルの次の行を想像してください。

,a,b,c,

その CSV 行には、要素、、、、、およびが含まれて""います。"a""b""c"""

同じことがあなたの{{TOKEN}}. 別の方法を使用できます。

MatchCollection allMatchResults = null;
Regex regexObj = new Regex(@"\{\{[^{}]*\}\}|[^{}]+");
allMatchResults = regexObj.Matches(subjectString);

単一の中かっこがトークン内またはトークン間で発生する可能性がある場合は、次を使用することもできます

Regex regexObj = new Regex(@"\{\{(?:(?!\}\}).)*\}\}|(?:(?!\{\{).)+");

ただし、すべての先読みアサーションのために少し効率が低下するため、必要な場合にのみ使用してください。

編集:あなたの投稿に別の質問があることに気付きました: なぜ正規表現を「機能させる」ために括弧を追加する必要があったのですか? 回答: 通常、split()コマンド は区切り文字の間の内容のみを返します。区切り文字 (またはその一部) を括弧で囲むと、それらの括弧内で一致するものはすべて、結果のリストにも追加されます。

于 2012-10-13T18:13:45.647 に答える
0

このパターンを試してみてください。トークンが一致として取得されます。

\b*\{{2}\w+\}{2}\b*
于 2012-10-13T18:18:21.300 に答える