# Pfadangabe validieren mit regexp



## kasi1983 (17. Jun 2006)

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:


```
[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


```
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 (17. Jun 2006)

```
[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 (17. Jun 2006)

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 (17. Jun 2006)

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


```
[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 (17. Jun 2006)

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


----------



## kasi1983 (17. Jun 2006)

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:


```
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 (17. Jun 2006)

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 (17. Jun 2006)

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


----------



## Timmah (17. Jun 2006)

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:
> 
> ...



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 (17. Jun 2006)

Timmah hat gesagt.:
			
		

> André Uhres hat gesagt.:
> 
> 
> 
> ...



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?


----------



## kasi1983() (17. Jun 2006)

> 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 (17. Jun 2006)

Okay,


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

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

ergibt true.
Mein Fehler  :lol:


----------



## kasi1983 (17. Jun 2006)

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:


```
[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 (17. Jun 2006)

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 (18. Jun 2006)

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 (18. Jun 2006)

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 (19. Jun 2006)

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...




```
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 (19. Jun 2006)

moormaster hat gesagt.:
			
		

> kasi1983 hat gesagt.:
> 
> 
> 
> ...



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.



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



Ok, danke, verstanden habe ich es jetzt.


----------



## moormaster (19. Jun 2006)

kasi1983 hat gesagt.:
			
		

> moormaster hat gesagt.:
> 
> 
> 
> ...



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 (19. Jun 2006)

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 (19. Jun 2006)

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*


----------

