2010-07-19 10 views
2

J'utilisais un modèle regex pour décomposer le chemin de contexte pour une servlet.Regex ne décompresse pas correctement le chemin du fichier avec un numéro de version

/{1,2}([^/{1,2}]+) 

Cela fonctionne très bien pour les chemins simples comme /User/folder1/folder2/folder3/.

Dans un scénario plus réaliste, cependant, il semble y avoir un problème si l'un des noms de dossiers contient un numéro de version en pointillés, tel que: /User/username/Library/Tomcat/apache-tomcat-6.0.24.

Dans ce cas Matcher.group(1) renverra apache-tomcat-6.0. au lieu de apache-tomcat-6.0.24. Je ne sais pas pourquoi cela arrive; Je crois que ça ne devrait pas.

Des idées?

Modifier

Cela fonctionne:

/{1,2}([^/]+) 
+1

En .NET {x, y} signifie correspondre aux occurrences x à y du dernier jeton. De plus, vous l'écrivez après la clause [...]. Qu'est-ce que cela signifie en Java? De plus, n'y a-t-il pas de String.Split que vous pourriez utiliser pour diviser sur /? – sisve

+0

@Philip à peu près répondu. Je dois me rappeler d'utiliser uniquement l'expression de quantificateur de plage en dehors des classes de caractères. Ma faute. Je pourrais aussi utiliser la fente de chaîne mais je veux aussi l'utiliser dans un autre modèle regex pour les expressions xpath afin de séparer l'espace de noms du prédicat. Merci pour votre commentaire! – FK82

Répondre

5

[^/{1,2}] signifie "tous les caractères sauf /, {, 1, ,, 2 et }", de sorte que le 2 de 24 ne soit pas adapté (Ce sera la même chose avec un chemin comme a/2 et n'est pas lié aux numéros de version). À l'intérieur […], la plupart des caractères sont interprétés littéralement, et les constructions telles que {1,2} ne fonctionnent pas. Je pense que cela devrait fonctionner si vous dites simplement [^/]+ à la place. Je ne suis pas sûr de savoir pourquoi vous voulez faire correspondre deux barres obliques consécutives de toute façon - il suffit de faire correspondre une seule barre oblique et de filtrer les noms de répertoires vides.

+0

Très bien, merci. La raison pour laquelle je veux faire correspondre les doubles barres est parce que je veux aussi utiliser cette regex pour les expressions xpath, dans lesquelles '//' est une abréviation pour tout élément descendant. – FK82