Hallo zusammen
In meinem Code will ich nur die Nomen (grossgeschriebenen) Wörter rausfiltern. Dies war auch kein Problem. Jedoch sind die Wörter nach den Satzzeichen auch alle gross geschrieben. Nun bin ich seit einigen Stunden am Probieren, wie ich diese Wörter entfernen kann.
Nun kam ich auf die ide, dass sämtliche Zeichenkombinationen gelöscht werden können . [A-Z]
Somit wenn nach einem . ein Leerzeichen und ein Punkt folgt wird dies einfach gelöscht.
Danach kann man den Satz in Wörter zerlegen und die Grossgeschriebenen Wörter rausfiltern.
Nun mein Problem wie muss ich dies eingeben im Regex, dass es mir den Punkt Space und den Anfang des grossen Buchstaben löscht?
static void Main(string[] args)
{
Regex myRegex = new Regex ("[A-ZÄÖÜ]");
Regex myRegex1 = new Regex(". [A-Z]");
String sortiert;
string beispielSatz = "Dies ist der Test Text man benötigt mich, um zu schauen ob die SQL-Anbindung einwandfrei funktioniert. Die Änderungen sind änderbar. Test!";
sortiert = myRegex1.Replace(beispielSatz, "");
Console.WriteLine(sortiert);
Console.WriteLine("-------------------------------------------------------------------");
string[] words = sortiert.Split(' ');
foreach (string word in words)
{
if (myRegex.IsMatch(word))
{
Console.WriteLine(word);
}
}
Console.ReadLine();
}
}
Ich würde mir ja mit Split('') ein Array erstellen und das durchlaufen, dann kannst du immer prüfen, was in der vorherigen Zeile enthalten war und somit eine Entscheidung treffen.
Sonderlich weit wird dich das aber nicht bringen, da das Hauptproblem die Entscheidung sein wird ob es nun ein Nomen ist oder ein andere Wort, dass nur aufgrund des Punktes großgeschrieben wurde.
Dazu könntest du einen "intelligenten" Filter bauen, der alle jemals kleingeschriebenen Worte speichert und dies als Entscheidungshilfe nimmt.
Letzten Endes wird das aber auch nur eine begrenzt brauchbare Lösung liefern, dafür ist die deutsche Sprache einfach zu kompliziert und kontextabhängig:
Fliegen fliegen hinter Fliegen, fliegen Fliegen Fliegen hinterher.
Beste Grüße
emuuuu
2+2=5( (für extrem große Werte von 2)
Ich würde mir ja mit Split('') ein Array erstellen
Das ist gar nicht notwendig, denn string ist bereits ein char-Array, dass man einfach iterieren kann.
Das ist gar nicht notwendig, denn string ist bereits ein char-Array, dass man einfach iterieren kann.
.. das funktioniert, weil String IEnumerable<char>
implementiert.
String ist eine ganz normale Klasse; kein Char-Array.
public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<String>, IEnumerable<char>, IEquatable<String>
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo csharper123,
Split brauchst du gar nicht. Das geht alles mit Regex alleine. Am besten mit Regex.Matche**s**
.
Dafür baust du dir ein Regex, der aufs ganze Wort passt und nicht wie bei dir auf ein einzelnes Zeichen. Und an den Anfang dieses Patterns schreibst du einen negativen Lookbehind für den unerwünschten Punkt, der das Ende das vorangegangenen Satzes kennzeichnet. Dran denken, den Punkt zu escapen: "\.
". Den Satzanfang am Anfang des Strings erkennst du an "^
".
Für Lookarounds und den ganzen Rest siehe [Artikel] Regex-Tutorial (insbesondere Abschnitt "4.13 Positive und negative Lookarounds"). Wenn man Lookarounds erstmal verstanden hat, kann man damit viele nette Sachen machen.
Komfortabel testen kannst du mit On-the-fly Regex-Tester: Regex-Lab.
herbivore
PS: Wie emuuu schon sagte, wird man mit einer syntaktischen Analyse nie eine 100%ig korrekte Trennlinie ziehen können: z.B. Abkürzungen. In diesem selbstbezüglichen Beispiel steht vor dem Nomen "Abkürzungen" ein Punkt, der aber kein Satzende kennzeichnet. Außerdem werden Nomen, die tatsächlich an einem Satzanfang stehen, von der geplanten Methode (fälschlich) nicht als solche erkannt.