近日小妹研究金融时间序列遇到一个字符串匹配的问题,请各位高人指点一下。不胜感激!
要用C#的Regex类实现才行……。在一目标字符串中利用“反向引用(或反向参照)”查找出所有重复的子字符串。也就是不需要源匹配字符串(但将要得到的匹配字符串的字符个数确定),而自动的在目标字符串中查找里面重复出现的子字符串。目标字符串是一个由01组成的:001110101010101000101010011011110101000001010101001110101……找到的匹配字符串要求字符个数确定,也就是事先确定要得到的匹配长度。比如:指定匹配长度为4,
那么得到的匹配结果可能是:0011,0101,0111,1000……。匹配过程应该类似"滑动窗口"。而且滑动的步数要可以事先指定。
最后要能输出找到的重复的子字符串和每个子字符串重复出现的次数。偶参考了一.NET的帮助文档,觉得反向引用似乎可以解决这个问题。但由于才疏学浅没能写出合适的表达式。恳请各位高人指点一二啊!小妹很急很急的.谢谢!!
要用C#的Regex类实现才行……。在一目标字符串中利用“反向引用(或反向参照)”查找出所有重复的子字符串。也就是不需要源匹配字符串(但将要得到的匹配字符串的字符个数确定),而自动的在目标字符串中查找里面重复出现的子字符串。目标字符串是一个由01组成的:001110101010101000101010011011110101000001010101001110101……找到的匹配字符串要求字符个数确定,也就是事先确定要得到的匹配长度。比如:指定匹配长度为4,
那么得到的匹配结果可能是:0011,0101,0111,1000……。匹配过程应该类似"滑动窗口"。而且滑动的步数要可以事先指定。
最后要能输出找到的重复的子字符串和每个子字符串重复出现的次数。偶参考了一.NET的帮助文档,觉得反向引用似乎可以解决这个问题。但由于才疏学浅没能写出合适的表达式。恳请各位高人指点一二啊!小妹很急很急的.谢谢!!
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);
}
回复: sunjian_qi(sonne)
如果不是整数也没关系,剩下不够四的余数忽略掉就可以,因为字符串长度很大,可以有误差的,不差哪一点了。。
在这个例子中每一个对象都是一组数字,在后面的大括号中就可以对这组数字进行处理了
给一点提示或许有帮助
微软帮助里提到的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);
}
}
}
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);
}
}
}
Console.WriteLine(c.Index);note, the index will be relative to the current string