prüfen, ob String nur die lateinischen Buchstaben A-Z, a-z und 0-9 enthält (Da Windows alles Mögliche zulässt, ist es wohl einfacher, im KeyDown nur erlaubte Zeichen zu akzeptieren)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    prüfen, ob String nur die lateinischen Buchstaben A-Z, a-z und 0-9 enthält (Da Windows alles Mögliche zulässt, ist es wohl einfacher, im KeyDown nur erlaubte Zeichen zu akzeptieren)

    Hi all,
    es gibt auf meinem Form eine Textbox, in der der Benutzer einen Ordnernamen eingeben soll. Dieses Verzeichnis wird dann erstellt. Ich stelle diese Frage, weil Windows mittlerweile alles mögliche an Zeichen akzeptiert. Ich möchte jedoch nur A
    Z, az und 09 haben.
    Ich habe bereits an .Contains(CharArray())
    gedacht, und das CharArray entält die gewünschten, lateinischen Buchstaben. Allerdings kommt mir das etwas umständlich vor, habe ich das Gefühl. Kennt jemand einen guten Trick? Es gibt doch bestimmt so etwas wie IsAsciiCharacter()
    @Bartosz Vielleicht so was: Path.GetInvalidFileNameChars(), da sind alle Zeichen drinne, die NICHT in einem Pfadnamen enthalten sein dürfen.
    docs.microsoft.com/de-de/dotne…ilenamechars?view=net-5.0
    Ansonsten aboniere das KeyDown-Event und lass nur die erlaubten Zeichen durch (und unterbinde C&P).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ascii-Character? Das würde Steuerzeichen und anderen Kram enthalten. Aber ich seh jetzt kein Problem darin zu schreiben:
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNPQRSTUVWXYZ0123456789".Contains(…)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Path.GetInvalidFileNameChars(),
    ist schon gut, danke! Ich stelle fest, dies unterbindet die ersten 31 ASCII-Zeichen, ein einzelnes ", und diese beiden < >.

    Ok, dann muss ich noch auf andere Zeichen prüfen. Ich glaube es wäre besser, wenn ich prüfe, ob "nur die lateinischen A-Z" vorkommen.

    aboniere das KeyDown-Event
    habe ich schon

    (und unterbinde C&P)
    Danke für den Tipp!

    =====================================================================================
    Edit:
    Ich stelle fest, es gibt so einiges, aber nichts ist wirklich hilfreich. Selbst dies
    If Char.IsLetter(StringToCheck.Chars(i)) von Stackoverflow würde Unicode zulassen ...

    Ascii-Character? Das würde Steuerzeichen und anderen Kram enthalten
    Auch wieder war. Ich dachte eigentlich, das wäre gut, aber es ist auch blöd: dann müsste man schreiben ASCII Zeichen von 48-57 und 65-90 und 97-122. Nö nö nö

    @VaporiZed Ich muss Zeichen für Zeichen abgleichen.
    Ich hatte auch probiert .contains("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNPQRSTUVWXYZ0123456789") aber das prüft, ob das alles drin ist. Ich weiß, so meinst du das nicht könnest du mir bitte sagen, wie du es meinst?

    Deswegen habe ich so viele Zeilen! Zugegeben, viel zu viele, daher die Threaderöffnung.

    Hier mal mein ursprünglicher Code

    VB.NET-Quellcode

    1. Private Sub TextBox_Ordnername_TextChanged(sender As Object, e As EventArgs) Handles TextBox_ordnername.TextChanged
    2. Dim Str As String
    3. If System.String.IsNullOrEmpty(TextBox_ordnername.Text) Then
    4. Return
    5. End If
    6. Str = TextBox_ordnername.Text
    7. Dim Result As Boolean = CheckForAlphabetCharacters(Str)
    8. If Result Then
    9. TextBox_ordnername.ForeColor = Color.Black
    10. Ordnername = TextBox_ordnername.Text
    11. Else
    12. TextBox_ordnername.ForeColor = Color.Red
    13. End If
    14. End Sub
    15. 'Validates a string of alphabet characters
    16. Function CheckForAlphabetCharacters(ByVal StringToCheck As String) As Boolean
    17. Dim erlaubt() As Char = {
    18. "A"c, "B"c, "C"c, "D"c, "E"c, "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c,
    19. "a"c, "b"c, "c"c, "d"c, "e"c, "f"c, "g"c, "h"c, "i"c, "j"c, "k"c, "l"c, "m"c, "n"c, "o"c, "p"c, "q"c, "r"c, "s"c, "t"c, "u"c, "v"c, "w"c, "x"c, "y"c, "z"c,
    20. "0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c}
    21. Dim cnt As Integer = 1
    22. For i = 0 To StringToCheck.Length - 1
    23. For j As Integer = 0 To erlaubt.Length - 1
    24. If Not StringToCheck.Chars(i) = erlaubt(j) Then
    25. cnt += 1
    26. If cnt = 62 Then
    27. Return False
    28. End If
    29. Else
    30. Exit For
    31. End If
    32. Next
    33. cnt = 0
    34. Next
    35. Return True 'Return true if all elements are characters
    36. End Function




    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bartosz“ ()

    Bartosz schrieb:

    Ok, dann muss ich noch auf andere Zeichen prüfen.
    Kyrillisch, Chinesisch, Hebräisch, ...
    Dann ist es wohl einfacher, im KeyDown nur erelaubte Zeichen zu akzeptieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Jou, war meine Idee dieses Threads. :) Habe meine Antwort editiert.
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Wenn du wirklich nur A-Z, a-z und 0-9 zulassen willst könnte man das auch mit Regex erschlagen: ^[A-Za-z0-9]+$
    @Bartosz OK, im .TextChanged-Event ist C&P mit erschlagen.
    Wewnn Du .ToUpper() testest, musst Du nur die Großbuchstaben in das Array eintragen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @slice Danke! Schaue ich mir an. Bin in Regex nicht so fit.
    im .TextChanged-Event ist C&P mit erschlagen.
    Wie meinst du das? Dass, weil es TextChanged ist, folgender Code im Form1_Load unnötig ist?

    VB.NET-Quellcode

    1. TextBox_ordnername.ShortcutsEnabled = False

    Wewnn Du .ToUpper() testest, musst Du nur die Großbuchstaben in das Array eintragen.
    :thumbup:
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Bartosz So wie @slice schon geschrieben hat würde ich es mit Regex versuchen.

    Console (mein C# mit telerik konvertierte Vb.net Code):
    FolderName@1232 -> false
    Folder Name 123 -> true

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Text.RegularExpressions
    3. Namespace CS_FolderNameRegex
    4. Class Program
    5. Private Shared Sub Main(ByVal args As String())
    6. Console.WriteLine("Enter Folder Name: ")
    7. Dim folderName As String = Console.ReadLine()
    8. Dim folderNameOkay As Boolean = Not Regex.IsMatch(folderName, "[^\w\s]")
    9. Console.WriteLine($"Format of FolderName {folderName} is correct: {folderNameOkay}")
    10. Console.ReadLine()
    11. End Sub
    12. End Class
    13. End Namespace


    Es ist so zusagen "nur" eine Zeile nötig um zu kontrollieren, ob ein unerwünschtes Zeichen gefunden wird.
    Dim folderNameOkay As Boolean = Not Regex.IsMatch(folderName, "[^\w\s]")

    Was heist [^\w\s] etc.
    rexegg.com/regex-quickstart.html
    und
    regexr.com

    Hier noch das original C# (den Vb.net Code habe ich nicht ausgeführt)

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Text.RegularExpressions;
    3. namespace CS_FolderNameRegex
    4. {
    5. class Program
    6. {
    7. static void Main(string[] args)
    8. {
    9. Console.WriteLine("Enter Folder Name: ");
    10. string folderName = Console.ReadLine();
    11. bool folderNameOkay = !Regex.IsMatch(folderName, @"[^\w\s]");
    12. Console.WriteLine($"Format of FolderName {folderName} is correct: {folderNameOkay}");
    13. Console.ReadLine();
    14. }
    15. }
    16. }
    17. //Achtung das ! negiert das Ergebnis "nochmal"
    18. // @"[^\w\s]" => 'w' ist jedes AlpaNumerische Zeichen 's' jedes Leerzeichen
    19. // wenn Leerzeiche nicht zugelassen werden sollen also @"[^\w]"
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nogood“ ()

    Wie ich das meinte:

    VB.NET-Quellcode

    1. For Each Character In ZuPrüfenderString
    2. If Not "abc…".Contains(Character) Then AnzahlInakzeptablerZeichen += 1
    3. Next
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Danke dir. Das hat mir gefehlt. Also dass er nicht denkt, alles soll enthalten sein. Woher weiß das Programm, dass die Variable Character ein Char ist?
    Ich habe nicht StringToCheck.Chars geschrieben :?:
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

    Bartosz schrieb:

    Woher weiß das Programm, dass die Variable Character ein Char ist?
    Option Infer On | Off:

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich würde wie in Post#2 beschrieben 'Path.GetInvalidFileNameChars()'
    eine weitere möglichkeit is mit 'IndexOf' im KeyPress
    dort kannst du sogar gezielt angeben wie oft ein Zeichen vorhanden sein darf

    hier ein Bsp.

    VB.NET-Quellcode

    1. Private Sub TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    2. If e.KeyChar = "."c Then
    3. 'punkt nur einmal erlaubt
    4. e.Handled = (CType(sender, TextBox).Text.IndexOf("."c) <> -1)
    5. ElseIf e.KeyChar = "E"c Then
    6. ' nur einmal E erlaubt
    7. e.Handled = (CType(sender, TextBox).Text.IndexOf("E"c) <> -1)
    8. 'Backspace erlaubt
    9. ElseIf e.KeyChar <> ControlChars.Back Then
    10. e.Handled = ("0123456789AaEe".IndexOf(e.KeyChar) = -1) '<--Zeichen erlaubt
    11. End If
    12. End Sub

    @Kasi What :?:
    Wieso testest Du im KeyPress-Event den kompletten Text?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!