近日小妹研究金融时间序列遇到一个字符串匹配的问题,请各位高人指点一下。不胜感激!
要用C#的Regex类实现才行……。在一目标字符串中利用“反向引用(或反向参照)”查找出所有重复的子字符串。也就是不需要源匹配字符串(但将要得到的匹配字符串的字符个数确定),而自动的在目标字符串中查找里面重复出现的子字符串。目标字符串是一个由01组成的:001110101010101000101010011011110101000001010101001110101……找到的匹配字符串要求字符个数确定,也就是事先确定要得到的匹配长度。比如:指定匹配长度为4,
那么得到的匹配结果可能是:0011,0101,0111,1000……。匹配过程应该类似"滑动窗口"。而且滑动的步数要可以事先指定。
最后要能输出找到的重复的子字符串和每个子字符串重复出现的次数。偶参考了一.NET的帮助文档,觉得反向引用似乎可以解决这个问题。但由于才疏学浅没能写出合适的表达式。恳请各位高人指点一二啊!小妹很急很急的.谢谢!!

解决方案 »

  1.   

    用不着反向引用,用MatchCollection就可以
    int step = 4;
    string num = "001110101010101000101010011011110101000001010101001110101";
    Regex textRegex = new Regex("\\d{" + step.ToString() + "}");
    MatchCollection mc = textRegex.Matches(num);
    foreach (Match m in mc)
    {
    Console.WriteLine(m.Value);
    }
      

  2.   

    谢谢: fancyf(凡瑞) 的回复,我这就去试一下。但有一点不明白,循环里的(Match m in mc)是怎么回事?Match m 这里好像只是创建了个Match类的实例啊,有什么作用吗?:?-------------------------------------------------
    回复: sunjian_qi(sonne)
    如果不是整数也没关系,剩下不够四的余数忽略掉就可以,因为字符串长度很大,可以有误差的,不差哪一点了。。
      

  3.   

    上面定义的mc对象是一个集合对象,是一个类型为Match的对象的集合,用foreach语句就是列举出mc这个集合中的每一个对象
    在这个例子中每一个对象都是一组数字,在后面的大括号中就可以对这组数字进行处理了
      

  4.   

    fancyf(凡瑞)的方法试过了,但是不是我要的结果啊,这个只是把字符串4个4个的输出来。而我想输出的是重复的子字符串啊。而且要知道这个子字符串重复出现过几次。
    给一点提示或许有帮助
    微软帮助里提到的c#的方向引用表达式:(?(<char>\\w{4})\\k<char>)“{}”里的4就可以确定查找的子字符串的字符个数是4个。
    -------------------------------
    这是我做的,能找到重复的子字符串,但是请大家运行一下就知道有什么问题了。
    [c#]using System;
    using System.Text.RegularExpressions;public class Rev
    {
      public static void Main()
      {
        MatchCollection mc;
        Regex r=Regex("(?(<char>\\w{4}\\w*)\\k<char>)");
        mc = r.Matches("tycAAAAklaAAAAcBBBBghqwBBBBrtyAAAAuidBBBBfghvb")
        for(int i=0;i<mc.Count;i++)
        {
          Console.WriteLine("Found matches: "+mc[i].Value);
        }
      }
    }
      

  5.   

    这也许并不符合你的要求,替换字符串也是个比较笨的办法using System;
    using System.Text.RegularExpressions;public class Rev
    {
      public static void Main()
      {
        string s = "tycAAAAklaAAAAcBBBBghqwBBBBrtyAAAAuidBBBBfghvb";
        
        Regex r=new Regex("(?<char>\\w+)(\\w*?(?<char>\\k<char>))+");    Match m = r.Match(s);
        while (m.Success)
        {
    string ms = m.Groups["char"].Value; Console.WriteLine("Found matches: {0}, count: {1}", ms, m.Groups["char"].Captures.Count); s = s.Replace(ms,"");
    m = r.Match(s);
        }
       
      }
    }
      

  6.   

    谢谢 saucer(思归)的办法,我回去就试一试。不论是不是能完全符合要求,看到你们的回复让我好感动啊!:)
      

  7.   

    我已经试过saucer(思归) 提供的方法了,就是我要的东东!十分感激!!!但是还差一点,如何能得到这些重复字串的位置呢?
      

  8.   

    foreach (Capture c in m.Groups["char"].Captures)
    Console.WriteLine(c.Index);note, the index will be relative to the current string