2014-09-03 5 views
0

Есть ли логичный способ поиска дубликатов подстрок в строке, которая будет работать независимо от того, сколько раз дублируется подстрока; затем верните количество раз, которое было дублировано последним словом.Поиск дубликатов подстрок?

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

Вы хотите самую длинную повторяющуюся подстроку? Могут ли быть другие строки между подстрокой? Как aaaaaabaaaaaa (x2 aaaaaa)? – brz

+1

Если вам нужна самая длинная повторяющаяся подстрока, тогда 'abc-abc-abc-abc-' будет отображаться как 'abc-abc-x2' –

+0

@AndrewShepherd Я спросил о' самой короткой' подстроке. Так что это можно разбить на 'abc-' – MCSharp

ответ

4

это работало для меня (..*?)(?=\1(?=\1*$)|$)demo
или даже короче (..*?)(?=\1*$)demo

  • (..*?) захвата по крайней мере один символ и добавить столько, сколько необходимо
  • (?=\1*$) опережающего просмотра для ранее захваченных результатов столько раз, сколько это возможно к концу.
+0

Это выглядит отлично и находит те же слова, но не видит 'yesnoyesnoyesnoesno1' как уникальную строку. 'yesno1' считается дубликатом. – MCSharp

+0

@MCSharp, вы правы, обновлено выше –

+0

Отличное регулярное выражение. Было бы полезно для других, если бы вы могли объяснить расстройство регулярного выражения. – MCSharp

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) 
+0

Это очень близко, но есть ли способ подсчитать строку как не повторяющуюся, если она не может быть разбита отлично? Например, «1231231234» считается «123 (x3)», но его нужно оставить как уникальную строку. – MCSharp

+0

Благодарим вас за ответ. Это очень полезно. Повторное выражение alpha bravo, включенное в ваш код, будет ответом префекта. – MCSharp

Смежные вопросы