5

文字列の一部を選択したいのですが、選択したい最後の文字が複数回出現する可能性があるという問題があります。

'Aggregate('一致する を選択して終了し')'たいのですが()、その間は無視できます。

例:

文字列: Substr(Aggregate(SubQuery, SUM, [Model].Remark * [Object].Shortname + 10), 0, 1)
は以下を返す必要があります: Aggregate(SubQuery, SUM, [Model].Remark * [Object].Shortname + 10)

文字列: Substr(Aggregate(SubQuery, SUM, [Model].Remark * ([Object].Shortname + 10)), 0, 1)
は以下を返す必要があります: Aggregate(SubQuery, SUM, [Model].Remark * ([Object] .ショートネーム + 10))

文字列: Substr(Aggregate(SubQuery, SUM, ([Model].Remark) * ([Object].Shortname + 10) ), 0, 1)
は以下を返す必要があります: Aggregate(SubQuery, SUM, ([Model].Remark) * ([オブジェクト].ショートネーム + 10) )

これを正規表現で解決する方法はありますか?私はC#を使用しています。

4

4 に答える 4

3

これは少し醜いですが、次のようなものを使用できます

Aggregate\(([^()]+|\(.*?\))*\)

すべてのテストに合格しますが、ネストされた括弧の 1 つのレベルにしか一致できません。

于 2013-08-07T13:17:50.580 に答える
1

このソリューションは、.NET のバランシング グループを使用して、ネストされた括弧の任意のレベルで機能します。

(?x)              # allow comments and ignore whitespace
Aggregate\(
(?:
  [^()]           # anything but ( and )
| (?<open> \( )   # ( -> open++
| (?<-open> \) )  # ) -> open--
)*
(?(open) (?!) )   # fail if open > 0
\)


入力がどれだけ変化するかはわかりませんが、質問の文字列の例では、これと同じくらい簡単なものが機能します:

Aggregate\(.*\)(?=,)
于 2013-08-07T15:21:29.410 に答える
0

System.Xml.Linq最終的に正規表現を避けることを検討する場合は、名前空間を使用する解析の代替手段を次に示します。

class Program
{
    static void Main()
    {
        var input = File.ReadAllLines("input.txt");
        input.ToList().ForEach(item => {
            Console.WriteLine(item.GetParameter("Aggregate"));
        });
    }

}
static class X
{
    public static string GetParameter(this string expression, string element)
    {
        XDocument doc;
        var input1 = "<root>" + expression
            .Replace("(", "<n1>")
            .Replace(")", "</n1>")
            .Replace("[", "<n2>")
            .Replace("]", "</n2>") +
            "</root>";
        try
        {
            doc = XDocument.Parse(input1);
        }
        catch
        {
            return null;
        }
        var agg=doc.Descendants()
            .Where(d => d.FirstNode.ToString() == element)
            .FirstOrDefault();
        if (agg == null)
            return null;
        var param = agg
            .Elements()
            .FirstOrDefault();
        if (param == null)
            return null;
        return element +
            param
            .ToString()
            .Replace("<n1>", "(")
            .Replace("</n1>", ")")
            .Replace("<n2>", "[")
            .Replace("</n2>", "]");
    }
}
于 2013-08-07T13:52:36.110 に答える