这个问题是OceanRain提的,我觉得很有意思,大家看看下面这个帖子的7楼和9楼就知道我的要求了
http://topic.csdn.net/u/20090608/11/6118ebe2-5ed5-4305-9947-d9573a26e764.html?26127这个问题要做,肯定是能解决,但我想不到什么简单和优雅的办法。我这里插入一个话题:
string patern="(a\d+)?(N\d+N)?(KKK\d+)?"
string newStr1="N231N";
string newStr2="KKK34"
newStr1和newStr2是符合patern模式的,我想得到的是它们所满足模式的字符串,即:
(N\d+N)和(KKK\d+) (有没有括号都可以)
跑题了啊,关键看看上面链接中的7楼和9楼

解决方案 »

  1.   

    那个帖子被楼主结了,所以这里再发一次:    class CsToD
        {
            private string[] groups;
            private string source;
            public CsToD(string source, string[] groups)
            {
                this.source = source;
                this.groups = groups;
            }
            public string Update(string newStr)
            {
                string target = source;
                foreach (string g in groups)
                {
                    Match m = Regex.Match(newStr, g);
                    if (m.Success)
                        target = Regex.Replace(target, g, m.Value);
                }
                return target;
            }
        }
    调用:
            private void button1_Click(object sender, EventArgs e)
            {
                string source = "d713s1541s2t0p1000to1500i3m90to110c50m1r0p1.htm";
                string[] groups = @"d\d+s\d+ s\d+t\d+ p\d+to\d+ i\d+ m\d+to\d+ c\d+ m\d+ r\d+p\d+".Split();
                CsToD ctd = new CsToD(source, groups);
                string replace = ctd.Update("p999to999i9m9r9p9");
                MessageBox.Show(replace);
            }
    我这个支持一次更新多个组,而楼主的分组里面有的组无法区分,比如s开头的有多种含义 
    但是楼主说了,每次只传入一个组,所以这个方法是没有任何问题的 
    如果每个组都完全不同,同时传入多个组也是能成功的 看各位还有没有更优雅的方式
      

  2.   

    以下只是一种思路,算不得优雅,不过可扩展性和性能上会好一些static Dictionary<string, Regex> getDic()
    {
        Dictionary<string, Regex> dic = new Dictionary<string, Regex>();
        dic.Add("ds", new Regex(@"(?i)d\d+s\d+"));
        dic.Add("pto", new Regex(@"(?i)p\d+to\d+"));
        dic.Add("m", new Regex(@"(?i)m\d+(?!\d*to)"));
        dic.Add("c", new Regex(@"(?i)c\d+"));
        dic.Add("p", new Regex(@"(?i)p\d+(?=\.)"));
        return dic;
    }
    Dictionary<string, Regex> pattern = getDic();
    Regex reg = new Regex(@"\d+");
    private string patternRep(string srcStr, string repStr)
    {
        string key = reg.Replace(repStr, "");
        if (pattern.ContainsKey(key))
        {
            return pattern[key].Replace(srcStr, repStr);
        }
        return srcStr;
    }
    //调用
    string test = "d713s1541s2t0p1000to1500i3m90to110c50m1r0p1.htm";
    string[] list = new string[] { "d0s22", "p200to500", "m2", "c20" };
    foreach (string s in list)
    {
        test = patternRep(test, s);
    }
    richTextBox2.Text = test;
      

  3.   

    这个还没结呢 
    http://topic.csdn.net/u/20090608/11/dcb34ca4-17f8-4de9-997f-d2746e2cba6f.html?98233