查找重复的子字符串?

时间:2014-09-03 02:57:47

标签: c# regex string substring formula

是否有一种逻辑方法可以在字符串中查找重复的子字符串,无论子字符串重复多少次都可以使用;然后返回与最终单词重复的次数。

For example, abc-abc-abc-
Can be broken into | abc- | abc- | abc-
                                 = abc- x3

Example 2, abc-abc-abc-abc-
Can be broken into | abc- | abc- | abc- | abc-
                                        = abc- x4

对于偶数重复,将字符串分成两半然后比较两个子字符串不是问题。然后你可以继续循环,直到两半不匹配。

对于奇数字符串长度,您可以将其分解为3rds并比较所有三个部分并执行相同的操作。

当一个单词重复7或11次时会出现问题。将长度除以4或5可能有效。

例如,包含yesnoyesnoyesnoyesnoyesnoyesnoyesno的字符串的子字符串yesno重复7 times.

是否有某种公式,正则表达式或linq可以将yesnoyesnoyesnoyesnoyesnoyesnoyesno转换为yesno (x7)

2 个答案:

答案 0 :(得分:4)

这对我有用(..*?)(?=\1(?=\1*$)|$) demo
甚至更短(..*?)(?=\1*$) demo

  • (..*?)捕获至少一个字符并添加所需数量
  • (?=\1*$)预先查看以前捕获的结果的次数。

答案 1 :(得分:1)

var list=new string[]{"abc-abc-abc-",
                    "abc-abc-abc-abc-",
                    "yesnoyesnoyesnoyesnoyesnoyesnoyesno"};
var reg=new Regex("(.+?)(?=\\1|$)");
foreach(var str in list)
{
  string result=string.Format("{0} (x{1})",reg.Match(str).Value,  reg.Matches(str).Count);
  Console.WriteLine(result);
}

输出:

abc- (x3)
abc- (x4)
yesno (x7)