Laden...

Wie kann ich das tschechische Alphabet zulassen (Eingabevalidierung)

Erstellt von Kuklinski vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.534 Views
K
Kuklinski Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren
Wie kann ich das tschechische Alphabet zulassen (Eingabevalidierung)

Liebe Freunde, erstmal wünsche ich allen Frohe Weihnachten!

Ich habe mal eine kurze Frage:
Ich habe eine Methode in der ich nur das Deutsche bzw. Englische Alphabet zulasse. Jetzt möchte ich aber dass auch das Tschechische Alphabet zugelassen wird, dieses enthält ja neben den normalen Zeichen auch sogenannte Diakritische Zeichen.
Kennt jemand vielleicht einen simplen bzw. möglichst einfachen/schlanken Weg das zu bewerkstelligen ohne die ganzen Zeichen des Tschechischen Alphabets in die eckigen Klammern einzutragen?

So sieht meine Methode derzeit aus:

        private string FrageBuchstabenKetteAb()
        {
            string eingabe = Console.ReadLine();

            if (eingabe != String.Empty)
            {
                System.Text.RegularExpressions.Regex pattern = new System.Text.RegularExpressions.Regex(@"^[A-Za-z]+$");

                while (!pattern.IsMatch(eingabe.Trim()) && eingabe != String.Empty)
                {
                    Console.WriteLine();
                    Console.WriteLine("Es sind nur Buchstaben A-Z erlaubt!");
                    Console.WriteLine("Sonderzeichen und Zahlen sind nicht zulässig!");
                    Console.WriteLine();
                    Console.Write("Bitte versuche es erneut: ");
                    eingabe = Console.ReadLine();
                }
            }
            return eingabe.ToUpper();
        }
49.485 Beiträge seit 2005
vor 6 Jahren

Hallo Kuklinski,

Ich habe eine Methode in der ich nur das Deutsche [...] Alphabet zulasse.

wie sieht die Methode denn aus? Die Methode unten lässt ja nur das englische Alphabet zu. Für das Deutsche fehlen noch die Umlaute und das (normale) Eszett (und evtl. das neue große Eszett). Ich vermute, da hast du die (zusätzlich) erlaubten Zeichen auch einfach alle einzeln aufgelistet.

Ansonsten kannst du mal in Liste der Unicode-Eigenschaften schauen. In Unicode sind die Zeichen ja in Kategorien eingeteilt (wobei ein Zeichen durchaus in mehreren Kategorien enthalten sein kann). Auf Anhieb habe ich da keine Kategorie gesehen, die nur die Zeichen enthält, die du willst. Aber vielleicht findest du mit etwas Recherche in diese Richtung doch noch was.

Dabei ist diakritisch alleine allerdings keine ausreichende Unterscheidung, weil viele Alphabete bestimmte diakritische Zeichen enthalten. Die deutschen Umlaute sind ja auch nur bestimmte diakritische Zeichen. Du willst halt die diakritischen Zeichen, die im Tschechischen verwendet werden.

Wenn du viele verschiedene Alphabete unterstützen willst, und du mit den bestehenden Unicode-Kategorien nicht weiter kommst, dann wäre es vermutlich sinnvoll, eine eigene Tabelle zu auszubauen, in der zu allen überhaupt erlaubten Zeichen eingetragen ist, in welchen Alphabeten sie vorkommen, wobei jedes Zeichen in beliebig vielen Alphabeten vorkommen kann. Wenn du die Tabelle hast, kannst du leicht eine Methode schreiben, die zu einem übergebenen Alphabet(snamen) alle enthaltenen Zeichen liefert (als char [] oder als String). Aus dieser Rückgabe kannst du dann den jeweils gewünschten Regex-Pattern bauen.

herbivore

C
2.121 Beiträge seit 2010
vor 6 Jahren

Oder die Zeichen einzeln durchlaufen und prüfen. Das dürfte ich allen Punkten schneller sein als ein sehr komplexer Regex, also sowohl beim coden, beim späteren verstehen des Codes und auch bei der Ausführung.

K
Kuklinski Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

@herbivore
Stimmt, ich muss mich korrigieren, Deutsche Umlaute sind in meiner Methode nicht zugelassen. Aber das ist so auch erwünscht. Ich brauche nur das englische und Tschechische Alphabet.

Also so wie ich das sehe ist in dem Fall die einfachste Möglichkeit dann doch die Zeichen die im Englischen Alphabet nicht vorkommen einzeln aufzulisten.
Ich dachte es gibt da evtl. sowas wie das A-Z für das Tschechische Alphabet.
Schade eigentlich dass es das nicht gibt, wird doch vermute ich jetzt mal recht häufig auf die ein oder andere Weise benötigt...

Vielen Dank euch Beiden für die Tips!

C
2.121 Beiträge seit 2010
vor 6 Jahren

Ich dachte es gibt da evtl. sowas wie das A-Z für das Tschechische Alphabet.

Guter Ansatz! czech character unicode ... sollte doch etliche Treffer bringen.

49.485 Beiträge seit 2005
vor 6 Jahren

Hallo chilic,

Oder die Zeichen einzeln durchlaufen und prüfen. Das dürfte ich allen Punkten schneller sein ...

schneller oder langsamer sind beim Programmieren irrelevante Kategorien, solange das in Bezug auf die Geschwindigkeit eigentlich relevante Kriterium schnell genug erfüllt ist. Wenn die Validierung einer Benutzereingabe z.B. 0,1 Millisekunden dauert, dann ist es vollkommen unnötig, diese Zeit auf 0.01 Millisekunden zu verkürzen. Selbst Faktor 10 bringt einem in diesem Fall überhaupt nichts. Diesen Umstand beschreibt auch der Satz: "premature optimization is the root of all evil".

Solange "schnell genug" (d.h. üblicherweise "ohne spürbare Verzögerung") erfüllt ist, sind die eigentlichen Kriterien die Fehlerfreiheit und die Lesbarkeit.

... als ein sehr komplexer Regex, also sowohl beim coden, beim späteren verstehen des Codes und auch bei der Ausführung.

Hier geht es nicht um einen sehr komplexen, sondern um einen wirklich simplen Pattern.

Doch auch unabhängig von der Komplexität der Pattern ist meine Erfahrung genau andersherum. Bei mir war Regex nicht nur deutlich leichter und schneller zu erstellen, sondern auch flexibler und immer deutlich leichter wartbar, gerade wenn die Aufgabe komplexer ist. Auch bei meiner Aufgabe im Programmierspiel kam dN!3L in seiner abschließenden Lösung zu einem ähnlichen Fazit:

Wenn ich den Aufwand der ganzen Nacharbeiten noch mit dazurechne, sind reguläre Ausdrücke eindeutig einfacher erstellt und man findet Fehler schneller.

Ich persönlich habe noch an keiner einzigen Stelle bereut, Regex eingesetzt zu haben, egal wie einfach oder komplex die Aufgabe war, ganz im Gegenteil.

Man darf auch nicht vergessen, dass ein Pattern nur dann komplex wird, wenn die Komplexität schon in der Aufgabe steckt und dann ergibt auch das Ausprogrammieren komplexen - und meiner Erfahrung nach eben sogar noch komplexeren - Code.

herbivore

K
Kuklinski Themenstarter:in
9 Beiträge seit 2017
vor 6 Jahren

Sehe ich ganz genau so.

Habe das ganze nun folgendermaßen gelöst:

private string FrageBuchstabenKetteAb()
        {
            string eingabe = Console.ReadLine();

            if (eingabe != String.Empty)
            {
                System.Text.RegularExpressions.Regex pattern = new System.Text.RegularExpressions.Regex(@"^[A-Za-zÁÉÍGÓXŠdÚnÝŽáéíHóYšeúoý]+$");

                while (!pattern.IsMatch(eingabe.Trim()) && eingabe != String.Empty)
                {
                    Console.WriteLine();
                    Console.WriteLine("Deine Eingabe war nicht richtig!");
                    Console.WriteLine("Es sind nur Buchstaben A-Z erlaubt!");
                    Console.WriteLine("Sonderzeichen und Zahlen sind nicht zulässig!");
                    Console.WriteLine();
                    Console.Write("Bitte versuche es erneut: ");
                    eingabe = Console.ReadLine();
                }
            }
            return eingabe.ToUpper();
        }

Anmerkung: Nicht alle Tschechischen Zeichen werden hier im Forum korrekt angezeigt!

49.485 Beiträge seit 2005
vor 6 Jahren

Hallo Kuklinski,

um Probleme mit Encodings zu vermeiden, die nicht alle (tschechischen) Zeichen enthalten, kann man auf die Regex-Notation \uxxxx ausweichen, siehe Escapezeichen in regulären Ausdrücken. Dann ist es egal, in welchem Encoding der Quellcode vorliegt und ebenfalls egal, welches Encoding der Compiler erwartet/verwendet, siehe auch /codepage (C# Compiler Options).

herbivore

4.938 Beiträge seit 2008
vor 6 Jahren

Hallo zusammen,

unter Czech Alphabet gibt es eine Tabelle dafür (müßtest nur die Dezimalzahlen in Hexadezimalzahlen umwandeln also z.B. &#193 nach \u00C1).