9.1(2)   ------    9.11
9(3).5(1) -----    999.5
89(2).7  ------    899.7
即括号前的一个数重复括号中的次数,无括号和(1)都是重复一次
能不能用一个正则就直接得出呢?

解决方案 »

  1.   

    哈,又找到一个好玩的问题,正则+委托string[] input = { "9.1(2)", "9(3).5(1)", "89(2).7" };
    Regex reg = new Regex(@"(\d)\((\d+)\)");
    foreach (string s in input)
    {
        richTextBox2.Text += "源字符串:" + s.PadRight(15, ' ') + "   替换结果:" + reg.Replace(s, delegate(Match m) { return new string(m.Groups[1].Value[0], Convert.ToInt32(m.Groups[2].Value)); }) + "\n";
    }
    /*-------输出--------
    源字符串:9.1(2)            替换结果:9.11
    源字符串:9(3).5(1)         替换结果:999.5
    源字符串:89(2).7           替换结果:899.7
    */
      

  2.   

    using System;
    using System.Text.RegularExpressions;class Program
    {
      static void Main()
      {
        string input = "A9(3).5(1)B";
        string output = Regex.Replace(input, @"(.)\(([0-9]+)\)",
          delegate(Match m){ return new string(m.Groups[1].Value[0], int.Parse(m.Groups[2].Value)); }
        );
        Console.WriteLine(output); // 输出:A999.5B
      }
    }
      

  3.   

    本帖最后由 lxcnn 于 2010-03-17 20:59:58 编辑
      

  4.   

    试试这个:
    (\d(\(\d+\))?)+\.?(\d(\(\d+\))?)*
      

  5.   

                string str = @"94(3).5(1)";
                Regex reg = new Regex(@"(\d)(?<value>\((?<count>\d+)\))");
                MatchCollection mc = reg.Matches(str);
                foreach (Match m in mc)
                {
                    for (int i = 1; i < Convert.ToInt32(m.Groups["count"].ToString()); i++)
                    {
                        str = str.Insert(str.IndexOf(m.Groups["value"].ToString()), m.Groups[1].ToString());
                    }
                    str = str.Replace(m.Groups["value"].ToString(), "");
                }
                Console.WriteLine(str);
                /*
                 9444.5
                */