Pfadangabe validieren mit regexp

Status
Nicht offen für weitere Antworten.

kasi1983

Mitglied
Hallo zusammen,

Hier ist ja schon viel über regular expressions diskutiert worden... Leider hilft mir keiner der hier gefundenen Beiträge - und auch Google entpuppte sich als wenig hilfreich. :###

Und zwar programmiere ich derzeit an einer kleinen Applikation, die eine Art Installer werden soll. (Über dessen Sinn oder Unsinn mag ich nicht diskutieren...)

In einem Schritt kann man einen Pfad eingeben, wo die Dateien hinkopiert werden sollen. Ich möchte überprüfen, ob dieser Pfad gültig ist, also vorne ein Laufwerksbuchstabe, keine von Windows verbotenen Zeichen wie ?, <, >, * etc. in den Ordnernamen,...

Ich hatte da an regular expressions gedacht. Nun sitze ich bereits seit Stunden daran, diesen Ausdruck zusammenzupfriemeln. Folgender ist herausgekommen:

Code:
[a-zA-Z]:\\\\[[[^/:*?\"<>|]+\\\\]*[[^/:*?\"<>|]+]\\\\?+]?+

[a-zA-Z]:\\\\ für den Laufwerksbuchstaben

dann 0 mal oder bleibig oft "ordnername\" und optional danach "ordnername" oder "ordnername\"

Das ganze funktioniert leider nicht, außer einem einfachen "c:\" oder "e:\" etc. erkennt er leider nichts. Ich teste das Ganze immer nur mit

Code:
public class test {

    public static void main(String[] args) {

        String test = "C:\\bla";
        if (test.matches("[a-zA-Z]:\\\\[[[^/:*?\"<>|]+\\\\]*[[^/:*?\"<>|]+]\\\\?+]?+")) {
            System.out.println("Ja doch");
        }
    }
}


Wahrscheinlich bin ich einfach zu verbohrt im Moment, um den Fehler zu finden, aber es macht mich wahnsinnig.
Hat jemand einen Geisteblitz? Oder hat jemand vielleicht eine Idee, wie man eine Pfadangabe anders validieren kann?

Vielen vielen Dank schon mal.

Kerstin
 

Timmah

Bekanntes Mitglied
Code:
[a-zA-Z]:\\([^/:*?\"<>|\]+\[]*\\)*

Hiermit kannst du einen Pfad wie C:\ORDNER1\ORDNER2\ validieren.

Aber wäre es nicht, wenn du einen Installer programmierst, per Knopfdruck einen JFileChooser zu öffnen, dessen Auswahl du in ein nicht-editierbares Textfeld einfügst? Dann hast du doch auf jeden Fall einen korrekten Pfad...
 

kasi1983

Mitglied
Hallo,

Zunächst mal danke :)
Also ich hatte mir das so gedacht, dass ich einen Standard-Pfad vorgebe. Sowas wie "C:\Programme\hierher". Daneben habe ich bereits einen Filechooser, mit dem man Verzeichnisse auswählen kann, wenn man will.
Ich möchte halt gerne, dass man das Verzeichnis manuell ändern kann, wenn einem z.B. der Name einfach nicht taugt, also z.B. einfach ein "c:\Programme\hier" drauß machen, ohne den Umweg über den Filechooser (den ich noch nie bei einer Installation verwendet habe...)
Vielleicht bin ich auch einfach zu perfektionistisch, aber irgendwie sollte das schon zu machen sein. Werde mit Deinem Ausdruck aber noch etwas weiterexperimentieren, danke.

Gruß,
Kerstin
 

kasi1983

Mitglied
Sodala, ging doch etwas schneller, als ich gedacht hatte. Habe nun meine Lösung mit Deiner bunt gemixt und bin letztlich auf diesen (bereits im Java-RegExp-Syntax geschriebenen) Ausdruck gekommen

Code:
[a-zA-Z]:\\\\[[^/:*?\"<>|]+\\\\]*

Der scheint nun alles zu erkennen (jedenfalls alles, was ich ausprobiert habe, und das ist ne Menge) Mit Backslash hinten und ohne (wobei sich das bei diesem Ausdruck meine Logik entzieht...), bloß das Laufwerk oder eine tiefere Ordnerstruktur. Das einzige, das ich nicht hinbekommen habe, ist, dass er bei einem einzelnen Backslash meckert (wobei das in Java ja eh schwierig is mit den Backslashes..). Da aber der zu matchende String aus einem Textfeld ausgelesen wird, werden aus den im Feld stehenden Backslashes eh automatisch doppelte. Daher hab ich das ganz rausgelassen.

Nochmals danke für den Anstoß, und meiner Ansicht nach wäre für diesen Thread jetzt ein Haken angebracht. :toll: Ich höre aber gerne noch ein paar Kommentare, wenn es welche gibt :)

Grüße
Kerstin
 

Timmah

Bekanntes Mitglied
Nach der Festplattenangabe kommt aber nur ein Slash und nicht zwei. Die Ordner werden ebenfalls nur mit einem Slash getrennt...
 

kasi1983

Mitglied
In Java ist der Backslash doch ein Sonderzeichen, also mit \\ "codiert". Oder stehe ich komplett auf der Leitung?. Denn wenn ich in Java einen String deklarieren möchte:

Code:
String test = "C:\Dokumente und Einstellungen";

Gibt es ja die Fehlermeldung "Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )" (in eclipse)

Also: ein Backslash, der als Backslash im String stehen soll, funktioniert nur mit \\
 

moormaster

Top Contributor
Timmah hat gesagt.:
Nach der Festplattenangabe kommt aber nur ein Slash und nicht zwei. Die Ordner werden ebenfalls nur mit einem Slash getrennt...

Das mag in Unix gelten... in Windows sind das alles Backslashes zwischen den Ordnern und hinter dem : des Laufwerksbuchstaben.
 

André Uhres

Top Contributor
Kleiner Tippfehler (denk ich mal):
[a-zA-Z]:\\\\[[^/:*?\"<>|]+\\\\]*
sollte so sein: [a-zA-Z]:\\\\([^/:*?\"<>|]+\\\\)*
 

Timmah

Bekanntes Mitglied
André Uhres hat gesagt.:
Kleiner Tippfehler (denk ich mal):
[a-zA-Z]:\\\\[[^/:*?\"<>|]+\\\\]*
sollte so sein: [a-zA-Z]:\\\\([^/:*?\"<>|]+\\\\)*

Jo, so hatte ich das ja auch gepostet.

kasi1983 hat gesagt.:
In Java ist der Backslash doch ein Sonderzeichen, also mit \\ "codiert". Oder stehe ich komplett auf der Leitung?. Denn wenn ich in Java einen String deklarieren möchte:

Code:

1


String test = "C:\Dokumente und Einstellungen";


Gibt es ja die Fehlermeldung "Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )" (in eclipse)

Also: ein Backslash, der als Backslash im String stehen soll, funktioniert nur mit \\

Ja schon, doch wenn du \\\\ angibst heißt das, dass du 2 Backslashes haben willst, und das ist meiner Meinung nach einer zu viel.
 

moormaster

Top Contributor
Timmah hat gesagt.:
André Uhres hat gesagt.:
Kleiner Tippfehler (denk ich mal):
[a-zA-Z]:\\\\[[^/:*?\"<>|]+\\\\]*
sollte so sein: [a-zA-Z]:\\\\([^/:*?\"<>|]+\\\\)*

Jo, so hatte ich das ja auch gepostet.

kasi1983 hat gesagt.:
In Java ist der Backslash doch ein Sonderzeichen, also mit \\ "codiert". Oder stehe ich komplett auf der Leitung?. Denn wenn ich in Java einen String deklarieren möchte:

Code:

1


String test = "C:\Dokumente und Einstellungen";


Gibt es ja die Fehlermeldung "Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )" (in eclipse)

Also: ein Backslash, der als Backslash im String stehen soll, funktioniert nur mit \\

Ja schon, doch wenn du \\\\ angibst heißt das, dass du 2 Backslashes haben willst, und das ist meiner Meinung nach einer zu viel.

RegExp benutzt seinerseits aber auch den Backslash als Escape Zeichen... d.h. wenn man in Java \\\\ schreibt, kommt das für die Verwertung als Regexp dann als \\ an, was dann wiederum durch RegExp nochmals ausgewertet wird und gegen \ getauscht wird... oder irre ich da?
 
K

kasi1983()

Gast
RegExp benutzt seinerseits aber auch den Backslash als Escape Zeichen... d.h. wenn man in Java \\\\ schreibt, kommt das für die Verwertung als Regexp dann als \\ an, was dann wiederum durch RegExp nochmals ausgewertet wird und gegen \ getauscht wird... oder irre ich da?

Genau so ist es, wenn man dieser Seite glauben darf.

Und die runden Klammern, mochte der Compiler bei mir nicht. Kann aber auch sein, dass da einfach noch ein zusätzliche Fehler drin war, als ich das getestet habe.
 

Timmah

Bekanntes Mitglied
Okay,

Code:
		String regex = "[a-zA-Z]:\\\\([^/:*?\"<>|+]*\\\\)*";
		String test = "C:\\Ordner\\";

		boolean matches = test.matches(regex);
		System.out.print(matches);

ergibt true.
Mein Fehler :lol:
 

kasi1983

Mitglied
so.... jetzt aber!! Nachdem ich nun die runden Klammern auf mysteriöse Weise doch zum funktioneren bewegen konnte, habe ich nun endgültig, den ganz exakten Ausdruck gefunden:

Code:
[a-zA-Z]:\\\\([^/:*?\"<>|]+\\\\)*(([^/:*?\"<>|]+\\\\)|([^/:*?\"<>|]+))?+

der erkennt jetzt auf nachvollziehbare und damit wahrscheinlich richtigere Weise Pfade, die mit einem \ abgeschlossen werden genauso wie Pfade ohne.
 

André Uhres

Top Contributor
Geht aber auch kürzer :wink:
[a-zA-Z]:\\\\[^/:*?\"<>|]*
Man könnte noch zusätzlich mit split("\\\\") splitten um zu checken ob jeder Ordnername
mindestens ein Zeichen hat und nicht mit Leerzeichen beginnt oder aufhört.
 

kasi1983

Mitglied
Aso, man verbietet die Backslashes nicht und damit müsste man sie gar nicht angeben. Aber das mit spilt verstehe ich nicht, sorry... (habe vorher noch nie was mit regulären Ausdrücken in Java gemacht)

Aso: und das mit den Leerzeichen habe ich getestet - Windows lässt es zu, damit mache ich mir auch nicht die Mühe es zu unterbinden ;-)
 

moormaster

Top Contributor
kasi1983 hat gesagt.:
Aso: und das mit den Leerzeichen habe ich getestet - Windows lässt es zu, damit mache ich mir auch nicht die Mühe es zu unterbinden ;-)

Hast du ein anderes Windows, als ich? Wenn ich einen Ordner mit Leerzeichen am Beginn oder Ende erstellen will, werden eben diese Leerzeichen am Anfang und am Ende des Namens automatisch entfernt.
 

André Uhres

Top Contributor
kasi1983 hat gesagt.:
Aso, man verbietet die Backslashes nicht und damit müsste man sie gar nicht angeben.
Genau.

kasi1983 hat gesagt.:
Aber das mit spilt verstehe ich nicht, sorry...
Code:
       String[] s  = str.split("\\\\");
        for (int i = 0; i < s.length; i++)
            System.out.println("'"+s[i]+"'");
Beispiel: mit str = "c:\\ o1\\o2" ergibt obiger Code die Ausgabe:
'c:'
' o1'
'o2'

Dabei ist ' o1' nicht zulässig denn ein Ordnername kann zwar Leerzeichen enthalten,
darf aber nicht damit beginnen oder enden, afaik.
 

kasi1983

Mitglied
moormaster hat gesagt.:
kasi1983 hat gesagt.:
Aso: und das mit den Leerzeichen habe ich getestet - Windows lässt es zu, damit mache ich mir auch nicht die Mühe es zu unterbinden ;-)

Hast du ein anderes Windows, als ich? Wenn ich einen Ordner mit Leerzeichen am Beginn oder Ende erstellen will, werden eben diese Leerzeichen am Anfang und am Ende des Namens automatisch entfernt.

Das macht Win XP bei mir auch, komisch ist allerdings, dass eine Ordner, den ich über Java erstelle schon ein Leerzeichen am Anfang haben kann. Also wenn ich den Ordner "c:\ hallo" erstellen will, macht Java mir das ohne Gemecker (wenn ich mkdir() benutze). Ich hab's getestet - wieso das in Java geht und mit Windows selber nicht - keine Ahnung.

Code:
String[] s  = str.split("\\\\");
for (int i = 0; i < s.length; i++)
System.out.println("'"+s[i]+"'");

Beispiel: mit str = "c:\\ o1\\o2" ergibt obiger Code die Ausgabe:
'c:'
' o1'
'o2'

Dabei ist ' o1' nicht zulässig denn ein Ordnername kann zwar Leerzeichen enthalten,
darf aber nicht damit beginnen oder enden, afaik

Ok, danke, verstanden habe ich es jetzt. :)
 

moormaster

Top Contributor
kasi1983 hat gesagt.:
moormaster hat gesagt.:
kasi1983 hat gesagt.:
Aso: und das mit den Leerzeichen habe ich getestet - Windows lässt es zu, damit mache ich mir auch nicht die Mühe es zu unterbinden ;-)

Hast du ein anderes Windows, als ich? Wenn ich einen Ordner mit Leerzeichen am Beginn oder Ende erstellen will, werden eben diese Leerzeichen am Anfang und am Ende des Namens automatisch entfernt.

Das macht Win XP bei mir auch, komisch ist allerdings, dass eine Ordner, den ich über Java erstelle schon ein Leerzeichen am Anfang haben kann. Also wenn ich den Ordner "c:\ hallo" erstellen will, macht Java mir das ohne Gemecker (wenn ich mkdir() benutze). Ich hab's getestet - wieso das in Java geht und mit Windows selber nicht - keine Ahnung.

Wahrscheinlich konnte Microsoft sich wieder nicht auf einen einzigen Standard festlegen, denn mkdir in der Windows Eingabebeaufforderung akzeptiert auch führende Leerzeichen... allerdings werden Leerzeichen am Ende des Namens ignoriert.

mkdir "C:\ hallo " legt also nur "C:\ hallo" an ;)
 

Illuvatar

Top Contributor
OT: Fragt mich nicht, wie oft ich mir schon was geschrieben hab (ich "verlier" das dann immer wieder 0o), um zum Beispiel .htaccess Dateien zu erzeugen... im Explorer darf man das ja nicht ;)
 

moormaster

Top Contributor
Illuvatar hat gesagt.:
OT: Fragt mich nicht, wie oft ich mir schon was geschrieben hab (ich "verlier" das dann immer wieder 0o), um zum Beispiel .htaccess Dateien zu erzeugen... im Explorer darf man das ja nicht ;)

Dafür hat notepad keine Probleme damit, .htaccess als Datei anzulegen *g*
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Input/Output Pfadangabe in .jar Datei Allgemeine Java-Themen 2
W Relative Pfadangabe in JEditorPane zur lokalen Datei Allgemeine Java-Themen 2
E Pfadangabe auf Bilddateien außerhalb der .jar Allgemeine Java-Themen 7
E File.mkdir Probleme mit rel. Pfadangabe?! Allgemeine Java-Themen 2
G Pfadangabe mit getResource Allgemeine Java-Themen 7
I Pfadangabe zu Files Allgemeine Java-Themen 2
F Pfadangabe bei Processbuilder Allgemeine Java-Themen 4
M Pfadangabe Allgemeine Java-Themen 2
L Bibliothek für kommerizielle Anwendungen validieren? Allgemeine Java-Themen 0
C IBAN und Bic Validieren (Algorithmus) Allgemeine Java-Themen 10
S String split mit spez. Regexp Allgemeine Java-Themen 2
I Best Practice Properties auslesen und splitten (RegExp?) Allgemeine Java-Themen 0
B Problem mit RegEs und org.apache.regexp.RE Allgemeine Java-Themen 5
D RegExp capturing groups Allgemeine Java-Themen 6
S teile einer datei mit Regexp ersetzen Allgemeine Java-Themen 5
N regexp für uhrzeit Allgemeine Java-Themen 4
F kleines regexp Problem. Allgemeine Java-Themen 3
S Eingabeprüfung mittels Regexp Allgemeine Java-Themen 5
G RegExp Allgemeine Java-Themen 3
L Mir unerklärlicher StackOveflow bei RegExp-Verarbeitung Allgemeine Java-Themen 3
@ [RegExp] Probleme bei Erstellung des Ausdrucks Allgemeine Java-Themen 3
M schwieriger RegExp Allgemeine Java-Themen 11
A Frage zu RegExp Allgemeine Java-Themen 3
V Frage zu RegExp Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben