2012-02-16 6 views
0

私は、機能的なテキストを探しているテキストブロックを解析する方法と、ANTLR(または類似のもの)だけを設定して利用することなく、テキスト内の空白を許す方法を知りたかった場合。構文解析で求められるのは、特定のアイテムのバリエーションだけです。.NETで特定の機能やパターンを探してテキストを解析し、空白を許す方法は?

例:以下の例では、Text、Required、およびTypeが存在する場合、その値が何であるかを調べたいと思います。それらはすべて存在するわけではありません。テキストブロック1と2では、興味のある値が解析されるときに、両方の項目の値が同じであることを知りたいと思います。 Textは "What is the label text"であり、Requiredは真であり、すべてのスペーシングを無視または許している間にTypeがヌルであるか指定されていない。

1. This is user entered text. {{Text="What is the label text {{ Ignore me and treat me as text }}?",Required=true    }}. I am some more user added {} text. 
2. This is user entered text. {{ Text  ="What is the label text {{ Ignore me and treat me as text }}?", Required=  True}}. I am some more user added {} text. 
3. This is user entered text. {{Text="What is the label text?",Type=Date}}. I am some more user added {} text. 
4. This is user entered text. {{ Text = "What is the label text?", Type = Date }}I am some more user added {} text. 
5. This is user entered text. {{ Text = "What is the label text?", Type = Date, Required = True }}I am some more user added {} text. 
+1

なぜxmlやjsonを使用しないのですか? http://en.wikipedia.org/wiki/JSON –

答えて

0

例では入れ子がないので、正規表現が行います。

+0

例としては入れ子になっている可能性がありますが、それはもっと複雑なサンプルになるかもしれないと思っていましたが、この状況が"無限の"ネスティング、例えばルックアップ機能はその中に別のルックアップ機能を持つことができます。この例では、ユーザーのプロファイル名が検索され、上部に変換され、テキスト "What is the label {0}?" 「ADONTZというラベルは何ですか?」になります。これはユーザーが入力したテキストです。 {{Text = "{{Lookup =" Profile "、Property =" Name "、Format =" ToUpper() "}}?"、必須= true}}とは何ですか? – jon333

+0

無限のネスティングには、CoCo/R、ANTLRなどのような "大人の"パーサが必要です。 – adontz

0

3つの正規表現の組み合わせを使用します。

Text\s*=\s*\"(?<Text>.*)\".*Type\s*=\s*(?<Type>\w*).*Required\s*=\s*(?<Required>\w*)は、3つの部分すべてが存在する場合に一致します。

Text\s*=\s*\"(?<Text>.*)\".*Type\s*=\s*(?<Type>\w*)は、「必須」がない場合に一致します。

Text\s*=\s*\"(?<Text>.*)\".*Required\s*=\s*(?<Required>\w*)は、 'タイプ'がない場合に一致します。

このonline regex parserを使用して、これらの式を試してみることができます。

0
var re = new Regex(@"(?i){{(?:[\s,]*(?:Text\s*=\s*""((?:[^""\\]|\\.)+)""|Type\s*=\s*(\w+)|Required\s*=\s*(\w+)))+"); 
foreach (Match m in re.Matches(text)) { 
    Console.WriteLine("Text: {0}\nType: {1}\nRequired: {2}\n", m.Groups[1], m.Groups[2], m.Groups[3]); 
} 

テキスト、必須およびタイプは任意の順序で指定でき、オプションです。 この正規表現は、テキスト内でエスケープされたシーケンスが存在することが想定されています。

関連する問題