Le remplacement illégal de caractère dans le nom de fichier
En Java, j'ai un Nom de Fichier-Chaîne. Là j'ai envie de remplacer tous les Caractères illégaux avec des '_', mais pas a-z
, 0-9
, -
,.
et _
J'ai essayé le code suivant: Mais cela n'a pas fonctionné!
myString = myString.replaceAll("[\\W][^\\.][^-][^_]", "_");
- Étant donné que le titre est plus général que le libellé de la question, ma solution à ce problème serait d'utiliser
filename = URLEncoder(fileName, "UTF-8")
pour les noms de fichiers. Le résultat de cette opération est toujours un nom de fichier valide. Cela permet également d'obtenir le nom de fichier d'origine caractères à l'aide deURLDecoder
sur le nom de fichier - Il n'est pas garanti que le nom du fichier résultant est toujours valide. * n'est pas un caractère valide.
- filename = URLEncoder(nom de fichier.replaceAll("\\*","%2A"), "UTF-8");
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de remplacer tout mais
[a-zA-Z0-9.-]
.Le
^
à l'intérieur des parenthèses signifie "NON"..
(période) signifie "n'importe quel caractère"... n'est-ce pas? Il devrait probablement être échappé comme"[^a-zA-Z0-9\\.-]"
... vous pouvez également ajouter un+
afin de "pack" de plusieurs caractères interdits:"[^a-zA-Z0-9\\.-]+"
....
et-
a échappé! J'ai réussi à obtenir cette regex de travail:[^a-zA-Z0-9_\\-\\.]
someString.replaceAll("[^a-zA-Z0-9.-]", "_")
fonctionne très bien sur les JDK 1.7.0_67. Quiconque a mis à jour la réponse n'a donc inutilement.[^a-zA-Z0-9_\\-\\.]
. Le trait d'union peuvent être inclus juste après le crochet ouvrant, ou juste avant la parenthèse fermante, ou juste après la négation de signe; sinon, il est considéré comme un spécificateur de gamme, donc dans votre exemple, à défaut de s'échapper en seraient la conséquence d'une erreur ou un comportement inattendu.-
est un sûr moyen de présenter aux futurs erreurs de compilation lorsque quelqu'un a besoin d'ajouter un autre personnage de la regex. J'ai l'habitude de la programmation dans des projets avec plusieurs personnes, j'aimerais échapper à la-
pour que le code soit plus modifiable. (Je dois tester le sans échappement version de la.
en ce qui concerne si il remplacera périodes ou non).[^.]
ne remplace pas les périodes. Je comprends votre point, qui est similaire à la meilleure pratique que nous devrions utiliser des parenthèses pour une seule instruction des conditions, même si elles ne sont pas "nécessaire", mais il vaut la peine de corriger l'hypothèse erronée que ". et - ont échappé". Les classes de caractères sont traités très différemment que le reste de la regex, et les utilisateurs d'entre eux doivent être conscients de la distinction. (Considérez que si.
et*
ont été traités comme des caractères génériques dans les classes de caractères, puis[.]
,[*]
, et[a-z*.]
seraient tous être l'équivalent d'un peu.
.)-
qui a provoqué le problème. Merci pour les nouvelles connaissances! (Oh, et n'oubliez pas de tester le code avant de poster! :))[^-a-zA-Z0-9.]
pour ceux qui préfèrent éviter les doublons en échappe. À l'intérieur de crochets,.
n'a pas besoin d'être échappés n'importe où, et-
n'a pas besoin d'être échappé sur les bords de l'expression (et&&
signifie intersection / et).Si vous êtes à la recherche pour les options sur la plateforme windows, alors vous pouvez essayer ci-dessous une solution pour rendre l'utilisation de tous les caractères valides autre que "\/:*?"<>|" dans le nom de fichier.
/\\:*?"<>|
"[\\\\/:*?\"<>|]"
Garder les choses simples.
http://ideone.com/TINsr4
Encore plus simple
Les Classes De Caractères Prédéfinies:
\w
Un caractère de mot:[a-zA-Z_0-9]
Je sais qu'il y a eu quelques réponses ici déjà, mais je tiens à souligner que j'ai eu à modifier la donnée suggestions légèrement.
C'est ce que j'ai eu à l'utiliser pour .matchs en Java pour obtenir les résultats souhaités. Je ne suis pas sûr si ce est correct à 100%, mais c'est la façon dont il a travaillé pour moi, il retourne true si il a rencontré tous les caractères autres que a-z A-Z 0-9 (.) (_) et (-).
Je voudrais savoir si il y a des failles dans ma logique ici.
Dans les réponses précédentes, j'ai vu une discussion de ce qui devrait ou ne devrait pas être échappé. Pour cet exemple, j'ai pris la fuite sans échapper à quoi que ce soit, mais vous devez échapper à la (-) moins de caractères pour être sûr qu'il va "casser" votre expression, sauf si c'est à la fin de la liste.
La (.) caractère de point n'a pas échappé à l'intérieur de l' ([]) des crochets, il semblerait, mais il ne sera pas vous faire du mal si vous n'y échapper.
Veuillez voir Java Modèles pour plus de détails.
Si vous souhaitez utiliser plus de comme [A-Za-z0-9], puis vérifiez MS Conventions de Nommage, et n'oubliez pas de filtrer "...des Personnages dont l'entier des représentations sont dans la plage de 1 à 31,...".