Regulärer Ausdruck zum Filtern von Pfaden

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von vrtz.

    Regulärer Ausdruck zum Filtern von Pfaden

    Hallo,

    Ich möchte folgenden regulären Ausdruck in VB.Net verwenden: ("(([a-zA-Z]:)|(\\\\[^/\\:\*\?""<>\|]+(\\[a-zA-Z]\$)?))\\([^/\\:\*\?""<>\|]+\\)*[^/\\:\*\?""<>\|]+(\.[^/\\:\*\?""<>\|]+[^/\\:\*\?""<>\|\s])?")|((([a-zA-Z]:)|(\\\\[^/\\:\*\?""<>\|\s]+(\\[a-zA-Z]\$)?))\\([^/\\:\*\?""<>\|\s]+\\)*[^/\\:\*\?""<>\|\s]+(\.[a-zA-Z0-9]+)?)

    Dieser soll filtern, ob ein Pfad ein typischer Microsoft-Pfad ist, wie zB:
    C:\test_for_spaces\test_extension | C:\test_for_spaces\test_extension.t92| "C:\test for spaces\New Text Document.txt" |\\machine1\shared_2\hello_world.txt | "\\machine1\c$\shared 4\hello world.txt"


    Quelle: regexlib.com/Search.aspx?k=full%20windows%20path
    Leider weiß ich nicht wie genau ich diesen Ausdruck verwende, aufgrund der ganzen Gänsefüßchen, die ja den String beenden. Ich habe versucht alle Gänsefüßchen mit Chr(34) zu ersetzen und die Strings zu splitten. Das geht aber daneben


    Wenn ein Pfad diesem Ausdruck nach nicht konform ist, möchte ich mit folgendem regulären Ausdruck checken, ob es sich um einen typischen Unix Pfad handelt:
    ^/{1}(((/{1}\.{1})?[a-zA-Z0-9 ]+/?)+(\.{1}[a-zA-Z0-9]{2,4})?)$

    Wie zB:
    /home/userxyz/


    Hintergrund ist, dass ich wissen muss, ob es sich bei einem Pfad um einen lokalen Pfad handelt oder um einen Pfad auf einem FTP/SFTP Server.

    Edit: Die Path-Klasse lässt auch einen Pfad wie /Test durch, und ist deshalb unbrauchbar.
    @vrtz
    Hi. Dein Pattern ist viel zu lang :)
    Das geht einfacher. Im Prinzip willst du ja nur prüfen, ob dein Pfad mit einem Laufwerkbuchstaben anfängt oder nicht.
    Dazu kannst du auch RegEx benutzen.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Text.RegularExpressions
    3. Public Class Form1
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. MessageBox.Show(IsWinPath("C:\test").ToString())
    6. MessageBox.Show(IsWinPath("/test/test").ToString())
    7. End Sub
    8. ''' <summary>Prüft den übergebenden String auf eine Windowspfadstruktur</summary>
    9. ''' <param name="p">Der zu prüfende String</param>
    10. ''' <returns>Boolean</returns>
    11. Public Function IsWinPath(ByVal p As String) As Boolean
    12. If (New Regex("[a-z]{1}\:\\", RegexOptions.IgnoreCase).Matches(p.Substring(0, 3)).Count > 0) Then
    13. Return True
    14. Else
    15. Return False
    16. End If
    17. End Function
    18. End Class

    Es wird quasi auf diese Struktur am Anfang des Strings geprüft "C:\"
    in vb kann man Quotes innerhalb von Strings durch Verdopplung darstellen.
    Habichmal gemacht, kam dieses bei raus:

    Quellcode

    1. (""(([a-zA-Z]:)|(\\\\[^/\\:\*\?""""<>\|]+(\\[a-zA-Z]\$)?))\\([^/\\:\*\?""""<>\|]+\\)*[^/\\:\*\?""""<>\|]+(\.[^/\\:\*\?""""<>\|]+[^/\\:\*\?""""<>\|\s])?"")|((([a-zA-Z]:)|(\\\\[^/\\:\*\?""""<>\|\s]+(\\[a-zA-Z]\$)?))\\([^/\\:\*\?""""<>\|\s]+\\)*[^/\\:\*\?""""<>\|\s]+(\.[a-zA-Z0-9]+)?)
    Ob das nu für deinen Zweck das beste ist, kannichnich beurteilen - mir ist der zu kompliziert

    edit:
    mit RegexTester habichjetzt probiert, also bei was die "Matcht nicht" schreiben, da matchter doch, aber nur teilweise.

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

    RegEx und isMatch sind mir bekannt. Mir ging es ja um die Verwendung dieses Strings, welcher mehrere Gänsefüßchen enthält.

    Falls der reguläre Ausdruck auch falsche Ergebnisse liefert, werde ich wohl weiter suchen und/oder basteln müssen.

    Danke für den Tipp mit dem RegEx-Tester und dem Typ mit den Quotes.

    Wenn ich einen regulären Ausdruck habe, der meiner Meinung nach wie gewollt funktioniert, werde ich ihn hier posten.

    Gruß

    Funktion zum filtern von Pfaden

    Hallo,


    Anbei die Funktion mit der ich typische Unix-Pfade von Ms-Pfaden trenne (und von Syntax-Fehlern). Diese klappt bei meinen bisherigen Testfällen einwandfrei.
    Akzeptierte MS Pfade sind also Pfade mit Laufwerksbuchstaben (C:\Downloads) oder UNC-Pfade (\\fileserver\freigabe) -> returns MsPath

    VB.NET-Quellcode

    1. Public Function CheckPathType(ByVal pathTotest As String) As PathType
    2. Dim CheckForMsPath As New Regex("^((\\\\[a-zA-Z0-9-]+\\[a-zA-Z0-9`~!@#$%^&(){}'._-]+([ ]+[a-zA-Z0-9`~!@#$%^&(){}'._-]+)*)|([a-zA-Z]:))(\\[^ \\/:*?" + Chr(34) + Chr(34) + "<>|]+([ ]+[^ \\/:*?" + Chr(34) + Chr(34) + "<>|]+)*)*\\?$")
    3. Dim CheckForUnixPath As New Regex("^/{1}(((/{1}\.{1})?[a-zA-Z0-9 ]+/?)+(\.{1}[a-zA-Z0-9]{2,4})?)$") ' Externe Pfade(Unix) zB. : /home/chn/hurz
    4. If CheckForMsPath.IsMatch(pathTotest) Then
    5. Return PathType.msPath
    6. ElseIf CheckForUnixPath.IsMatch(pathTotest) Then
    7. Return PathType.externalPath
    8. Else
    9. Return PathType.SyntaxErr
    10. End If
    11. End Function