3

私は次のような値を持つ文字列を持っています

{ctrl1} + {ctrl2}
({ctrl1} / {ctrl2}) * {ctrl3}
if ({ctrl1} > {ctrl2}) then {ctrl1} * 10 else {ctrl} + {ctrl2} endif

このようないくつかの式がある可能性があります。これは文字列変数で利用可能になります。すべての値を抽出する必要があり{..}ます。

したがって、例1では、、を抽出する必要が{ctrl1}あり{ctrl2}ます。{ctrl1}例2では、​​、、を抽出する必要が{ctrl2}あり{ctrl3}ます。例3では、、を抽出する必要が{ctrl1}あり{ctrl2}ます。

誰かがこれの正規表現を手伝ってくれませんか?

4

4 に答える 4

2

おそらく次のようなものが必要です{[^}]+}

ただし、のような再帰的なものは処理しないことに注意してください{hello{2}}。おそらく、そのようなものには実際のパーサーが必要になるでしょう。

于 2012-07-07T13:36:39.103 に答える
1

トリック{\S+?}を行う必要があります。

于 2012-07-07T13:31:29.023 に答える
0

正規表現とLINQを組み合わせて、これを行うことができます:

Regex.Matches(input, "{.*?}").Cast<Match>().Select(m => m.Value).Distinct();

仮定{ctrl}は最後の例のタイプミスでした。

于 2012-07-07T13:55:53.490 に答える
-2
private void TrimControlNames()
    {
        if (txtFormula.Text.Trim().Length > 0)
        {
            string formula = txtFormula.Text.Trim();

            string pattern1 = "{[a-zA-Z0-9$_ ]+}"; //to identify control placeholders
            StringBuilder names = new StringBuilder();
            foreach (Match m in Regex.Matches(formula, pattern1))
            {
                if (m.Value.Contains(" "))
                {
                    string str = m.Value.Replace(" ", string.Empty); //It is ok to remove like this since control names are not allowed to have spaces.
                    formula = formula.Replace(m.Value, str);
                }

            }

            txtFormula.Text = formula;
        }

    }

このメソッドは、私が期待したことを実行します。

于 2012-07-07T13:51:39.340 に答える