是否有一种逻辑方法可以在字符串中查找重复的子字符串,无论子字符串重复多少次都可以使用;然后返回与最终单词重复的次数。
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)
?
答案 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)