Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Nomenfilter erstellen
csharper123
myCSharp.de - Member



Dabei seit:
Beiträge: 1

Themenstarter:

Nomenfilter erstellen

beantworten | zitieren | melden

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();
        }
    }
private Nachricht | Beiträge des Benutzers
emuuu
myCSharp.de - Member

Avatar #avatar-4078.jpg


Dabei seit:
Beiträge: 286

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 344
Herkunft: Kassel

beantworten | zitieren | melden

Zitat von emuuu
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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15510
Herkunft: BW

beantworten | zitieren | melden

Zitat von Papst
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>
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo csharper123,

Split brauchst du gar nicht. Das geht alles mit Regex alleine. Am besten mit Regex.Matches.

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.
private Nachricht | Beiträge des Benutzers