RegEX, Dateinamen unter Windows

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    RegEX, Dateinamen unter Windows

    Hallo Ihr Lieben,

    ich versuche gerade eine ValidationRule anzulegen, welche mir sagt, wenn der Nutzer einen Char eingegeben hat, der nicht in einem Dateinamen enthalten sein darf, aber ich komme einfach nicht dahinter welches RegEx-Pattern ich dafür benötige, ich such mir glaube nun schon fast 2 Stunden die Finger Wund aber es will einfach mit keinem zu findenden Pattern funktionieren.. Hatt gerade zufällig jemand das korrekte Pattern zur Hand ?


    VB.NET-Quellcode

    1. Imports System.Globalization
    2. Imports System.Text.RegularExpressions
    3. Namespace ValidationRules
    4. Public Class AcceptableFilenameValidationRule
    5. Inherits ValidationRule
    6. Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
    7. If Not value Is Nothing Then
    8. If Regex.IsMatch(value.ToString, "^[^.\\/:*?""<>|]?[^\\/:*?""<>|]*") Then
    9. Return New ValidationResult(False, "Dieses Feld enthält Zeichen, welche in Dateinamen nicht zulässig sind.")
    10. Else
    11. Return ValidationResult.ValidResult
    12. End If
    13. Else
    14. Return ValidationResult.ValidResult
    15. End If
    16. End Function
    17. End Class
    18. End Namespace



    Hintergrund ist übrigens, das bei einem Programm, die eingegebene Bestellnummer, teil der am Ende erzeugten Datei wird, bei uns sind Bestellnummern eigentlich immer identisch, eine Kollegin meinte letztens sie müsste da einfach irgendwas reinschreiben und hat sich dann beschwert, dass das Programm die Datei einfach nicht erstellt 8|
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    Ich habe keine Ahnung von Regex. Würde wohl auch, wie @ErfinderDesRades, mit String.Contains probieren. Aber was mir auffällt, du reichst den value als object rein und castest es nirgends als string.
    Regex.IsMatch() erwartet aber einen string laut MSDN.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    probierma so:

    VB.NET-Quellcode

    1. Namespace ValidationRules
    2. Public Class AcceptableFilenameValidationRule : Inherits ValidationRule
    3. Private Shared invalidChars As New HashSet(Of Char)(IO.Path.GetInvalidFileNameChars)
    4. Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
    5. If value?.ToString.Any(AddressOf invalidChars.Contains) Then
    6. 'ValidResult.False nur, wenn value vorhanden, aber invalid ist
    7. Return New ValidationResult(False, "Dieses Feld enthält Zeichen, welche in Dateinamen nicht zulässig sind.")
    8. End If
    9. Return ValidationResult.ValidResult
    10. End Function
    11. End Class
    12. End Namespace

    Akanel schrieb:

    Aber was mir auffällt, du reichst den value als object rein und castest es nirgends als string. Regex.IsMatch() erwartet aber einen string laut MSDN.


    ?

    VB.NET-Quellcode

    1. If Regex.IsMatch(value.ToString, "^[^.\\/:*?""<>|]?[^\\/:*?""<>|]*") Then

    Hier steht doch value.ToString, und da ich weis das defenitiv nur ein String eingegeben wird (dürft ja auch nix andres gehen in einer normalen Textbox) reicht das aus, directCast ginge selbstrebend auch aber, wofür Kanonen auf Spatzen?


    ErfinderDesRades schrieb:

    Private Shared invalidChars As New HashSet(Of Char)(IO.Path.GetInvalidFileNameChars)
    Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
    If value?.ToString.Any(AddressOf invalidChars.Contains) Then
    'ValidResult.False nur, wenn value vorhanden, aber invalid ist
    Return New ValidationResult(False, "Dieses Feld enthält Zeichen, welche in Dateinamen nicht zulässig sind.")
    End If
    Return ValidationResult.ValidResult
    End Function


    Jaa =) das funktioniert einwandfrei !! Ich ging schon davon aus das ich es durch String.Contains machen muss wie du vorher meintest und da wäre wohl ein sehr unleserlicher Code bei herausgekommen

    Danke dir !
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Falls es doch noch jemand per RegEx gelöst sehen will, ich habs endlich hinbekommen:

    VB.NET-Quellcode

    1. ​Imports System.Globalization
    2. Imports System.Text.RegularExpressions
    3. Namespace ValidationRules
    4. Public Class AcceptableFilenameValidationRule
    5. Inherits ValidationRule
    6. Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
    7. If Not value Is Nothing Then
    8. If Regex.IsMatch(value.ToString, "[\\/:*?""<>|\r\n]") Then
    9. Return New ValidationResult(False, "Dieses Feld enthält Zeichen, welche in Dateinamen nicht zulässig sind.")
    10. End If
    11. Return ValidationResult.ValidResult
    12. End If
    13. Return ValidationResult.ValidResult
    14. End Function
    15. End Class
    16. End Namespace
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Zum Aufhübschen:

    zeile #14 kann weg.
    Und die dann übrigbleibenden verschachtelten Ifs kann man per AndAlso verketten.
    Und den IsNot-Operator verwenden.
    Das Prinzip ist: Verschachtelung vermeiden - weil die ist immer unleserlich.
    Mehrfach-Verneinung "Not bla is Nothing" ist auch eine Art verschachtelung.
    Ok, das mit Zeile 14 leuchtet mir schon mal ein, zum IsNot-Operator, ist das rein zwecks der angenehmeren lesbarkeit, oder ergeben sich dadurch auch performance-Vorteile ?
    Und hab ich deine Anregung hier richtig verstanden und umgesetzt ?

    VB.NET-Quellcode

    1. ​If value IsNot Nothing AndAlso Regex.IsMatch(value.ToString, "[\\/:*?""<>|\r\n]") Then
    2. Return New ValidationResult(False, "Dieses Feld enthält Zeichen, welche in Dateinamen nicht zulässig sind.")
    3. End If
    4. Return ValidationResult.ValidResult


    LG und Danke
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    jo - so meinte ich das.
    Nein - ich schiele damit nicht auf Performance. Nach korrekter Funktion ist mit groossem Abstand zu allem anderen das Allerwichtigste die Lesbarkeit.
    Sonst (fast) nichts.
    Man kann sogar sagen: die gesamte Evolution aller Hochsprachen ist zu 95% auf allein dieses Ziel ausgerichtet: Lesbarkeit.
    Erst weit weit weit danach kommen irgendwann mal: Geschwindigkeit, Speicher-Effizienz.
    Und dabei zeigt sich, dass Lesbarkeit auch diese ungemein befördert.