2

複雑なクエリとフィルタリングに URL を使用しようとしています。
式ツリーと、正規表現と文字列操作の組み合わせを使用して、より単純な一部を機能させることができましたが、次に、より複雑な文字列の例を見ました。

 var filterstring="(|(^(categoryid:eq:1,2,3,4)(categoryname:eq:condiments))(description:lk:”*and*”))";

これを部分的に解析できるようにしたいのですが、再帰的にすることもできます..次のように出力したいと思います。

   item[0] (^(categoryid:eq:1,2,3,4)(categoryname:eq:condiments)
   item[1] description:lk:”*and*”

そこから、 item[0] 部分を削除して取得できます

categoryid:eq:1,2,3,4
categoryname:eq:condiments

現時点では、RegEx と文字列を使用して | を検索しています。^ それが AND か OR かを知るために、RegEx は括弧に一致し、単一の項目に対してうまく機能します。

正規表現は次のようになります

@"\((.*?)\)"

ネストされたブラケットと一致するように正規表現を使用する方法が必要であり、助けていただければ幸いです。

4

3 に答える 3

2

文字列を有効な XML に変換できます (単純な置換のみで、検証は行われません)。

var output = filterstring
    .Replace("(","<node>")
    .Replace(")","</node>")
    .Replace("|","<andNode/>")
    .Replace("^","<orNode/>");

次に、たとえば を使用して XML ノードを解析できますSystem.Xml.Linq

XDocument doc = XDocument.Parse(output);

あなたのコメントに基づいて、必要なラッピングを取得するために XML を再配置する方法は次のとおりです。

foreach (var item in doc.Root.Descendants())
{
    if (item.Name == "orNode" || item.Name == "andNode")
    {
        item.ElementsAfterSelf()
            .ToList()
            .ForEach(x =>
            {
                x.Remove();
                item.Add(x);
            });
    }
}

結果の XML コンテンツは次のとおりです。

<node>
  <andNode>
    <node>
      <orNode>
        <node>categoryid:eq:1,2,3,4</node>
        <node>categoryname:eq:condiments</node>
      </orNode>
    </node>
    <node>description:lk:”*and*”&lt;/node>
  </andNode>
</node>
于 2013-07-11T10:12:21.013 に答える
1

フィルター文字列で指定された値が必要であることは理解しています。

私の解決策は次のようになります。

NameValueCollection values = new NameValueCollection();
foreach(Match pair in Regex.Matches(@"\((?<name>\w+):(?<operation>\w+):(?<value>[^)]*)\)"))
{
     if (pair.Groups["operation"].Value == "eq")
         values.Add(pair.Groups["name"].Value, pair.Groups["value"].Value);
}

正規表現は (name:operation:value) を理解しますが、他のすべてのものは気にしません。

このコードを実行すると、次のような値を取得できます。

values["categoryid"]
values["categoryname"]
values["description"]

これがあなたの探求に役立つことを願っています。

于 2013-07-11T10:55:31.017 に答える