Laden...

Satz, der sich in einem String immer wiederholt, ermitteln

Letzter Beitrag vor 15 Jahren 9 Posts 1.586 Views
Satz, der sich in einem String immer wiederholt, ermitteln

allo =D,

ich suche jemanden mit viel Kreativität.

Wie ihr wisst, benötigt man zum splitten, den
Datentyp char.
Leider kann char aber keine Wörter speichern, sondern
nur geringe Datenmengen.
Leider muss ich einen String aufteilen.
Ich habe einen Satz nehmen wir an

"Hallo ich heiße Thomas.Hallo Ich heiße Thomas.Hallo ich heiße Thomas."

Und ich brauche daraus aber nur einmal "Hallo ich heiße Thomas".
Das Problem ist ja, der Satz ist nicht immer Hallo ich heiße Thomas
sondern ist variabel, was heißt was die Sache nochmal schwieriger macht.
Ich möchte im Grunde genommen, als output nur einmal

"Hallo ich heiße Thomas."

Ich würde ja am Punkt splitten, aber ggf. sind die Punkte im variablen Satz anders verteilt, sodass ich nicht weiß wo sich der Punkt befindet, weil sich der Satz verändert, pro Durchgang.

Ich hoffe jemand versteht mich, und kann mir helfen.

MfG
Substr

Hallo substr,

ja, das wird schon ein bisschen schwierig werden.
Denn mit dem "normalen" Splitten kommst du da nicht wirklicht weit.
Ich bin zwar keine Regex-Experte, aber mein Wissen reicht wohl um zu sagen, dass es damit auch nicht gut zu lösen ist.

Ich würde den String vom Anfang aus Wort für Wort durchgehen.
Diese hängst du so lange an einen zweiten String an, bis du eine Gemeinsamkeit zwischen den ersten Teil des neuen Strings und zwischen dem aktuellen Teil erkennst.
Zur Sicherheit gehst du dann auch noch die restlichen Wörter durch und vergleichst auch diese.

ich suche jemanden mit viel Kreativität.

war das genug kreativität? 😉

Solche Dinge sind immer schwer zu erklären, aber so siehst du ungefähr wie ich das machen würde.

Gruss
Michael

Hi,

habe ich das richtig verstanden, also ca. so


string[] split_sentence = input.Split(' ');

string string_2 = string.Empty;

for(int i = 0; i < split_sentence.Length; i++)
{
    if(string_2.Contains(split_sentence[i]))
    {
         break;
    }
    else
    {
          string_2 += split_sentence[i] + " ";
    }
}

Ungefähr so?
Substr

Hallo Substr,

ja, genau...
Das war mein Ansatz.

Wobei das noch ein paar Bugs hat.
Erstens musst du das Contains durch ein StartsWith ersetzen.

Zweitens gibt es so Probleme, wenn du z.B. einen Satz hast in dem ein Wort zweimal vorkommt.
z.B.


Der Schnee der ist schön.Der Schnee der ist schön.Der Schnee der ist schön.

Hier würde das Programm beim zweiten Der schon glauben, dass es sich um eine Wiederholung handelt, obwohl diese noch ein Teil vom ersten Satz ist.
Deshalb ist es wichtig, dass du auch die nachfolgenden Wörter vergleichst.
Und nachdem du alle Wörter verglichen hast, weisst du genau ab welchem Punkt sich die Wörter nur noch wiederholt haben (wo also der neue Satz begonnen hat).

Gruss
Michael

Man braucht für einen Split nicht unbedingt einen char als Separator.

Natürlich kann man Split auch mit einem String[] füttern:


String toSplit = "Mein Name, der ist Thomas! Mein Name, ist Thomas.Mein Name ist Thomas.";

String[] splitter = new String[] { "Mein Name" };
String[] tokens = toSplit.Split(splitter, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < tokens.Length; i++)
{
    MessageBox.Show(splitter[0] + tokens[i]);
}

Poste doch mal alle Variationen, die von so einem String vorkommen können. Dann lässt sich auch eine Regex dafür entwickeln.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

Hi!

Ich würd das sehr empfehlen, mit Regex anzufassen.
Wassich verstehe, willst du den String gar nicht zerschneiden, sondern suchst eine Übereinstimmung, einen match.
Sowas kann man eigentlich mit Regex fabelhaft definieren, nur musst du dir ganz ganz genau klar sein, was matcht, und was nicht:*Groß/Kleinschreibung? *nur ein Space zw. die Wörter, oder auch mehrere Spaces akzeptieren? *Tabulatoren, Linefeeds als Spaces akzeptieren? *Space vorm Punkt akzeptieren?

Der frühe Apfel fängt den Wurm.

Ich bin mal ein Spielverderber:

private static string FindDuplicate(string s)
        {
            LinkedList<int> matches = new LinkedList<int>();
            int i = 0;
            Char first = '\0';
            foreach (char c in s)
            {
                if (i == 0)
                {
                    first = c;
                }
                else
                {
                    if (first == c)
                    {
                        matches.AddLast(i);
                    }
                    LinkedListNode<int> act = matches.First;
                    while (act != null)
                    {
                        LinkedListNode<int> next = act.Next;
                        if (c != s[i - act.Value])
                        {
                            matches.Remove(act);
                        }
                        else
                            if ((i & 1) == 1 && act.Value == (i + 1) / 2)
                            {
                                //Testen, ob sich der Satz auch im Rest des Strings wiederholt:
                                int i2,i3 = 0;
                                for (i2 = i + 1; i2 < s.Length; i2++)
                                {
                                    if (s[i3] != s[i2])
                                    {
                                        matches.Remove(act);
                                        break;
                                    }
                                    i3++;
                                    if (i3 >= act.Value)
                                        i3 = 0;
                                }
                                if (i2 >= s.Length)
                                { return s.Substring(0, act.Value); }
                            }
                        act = next;
                    }
                }
                i++;
            }
            return null;
        }

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

Hm, vielleicht hilft dir noch dieser Thread?

Dann kann zwischen den Sätzen sogar noch was dazwischen stehen...

Hallo floste,

*ich* bin mal ein Spielverderber:

So einfach geht das mit Regex: ^(.+?)\1+$

Als komplette Funktion also:


private static string FindDuplicate(string s)
{
   return Regex.Match (s, @"^(.+?)\1+$").Groups [1].Value;
}

Kann man alles natürlich noch weiter verfeinern, aber auch das wäre einfach.

herbivore