En Java, j'ai une chaîne de nom de fichier. Là, je veux remplacer tous les caractères illégaux par '_', mais pas a-z
, 0-9
, -
, .
et _
J'ai essayé le code suivant: Mais cela n'a pas fonctionné!
myString = myString.replaceAll("[\\W][^\\.][^-][^_]", "_");
Vous devez tout remplacer, sauf [a-zA-Z0-9.-]
. Le ^
entre crochets signifie "PAS".
myString = myString.replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
Si vous recherchez des options sur la plate-forme Windows, vous pouvez essayer la solution ci-dessous pour utiliser tous les caractères valides autres que "\ /: *?" <> | "Dans le nom du fichier.
fileName = fileName.replaceAll("[\\\\/:*?\"<>|]", "_");
Encore plus simple
myString = myString.replaceAll("[^\\w.-]", "_");
Classes de personnage prédéfinies:
\w
Un caractère Word: [a-zA-Z_0-9]
Je sais qu’il ya déjà eu quelques réponses ici, mais je voudrais souligner que j’ai dû modifier légèrement les suggestions données.
filename.matches("^.*[^a-zA-Z0-9._-].*$")
C'est ce que je devais utiliser pour. Matches en Java pour obtenir les résultats souhaités. Je ne suis pas sûr que ce soit correct à 100%, mais voici comment cela a fonctionné pour moi. Il deviendrait vrai s'il rencontrait un caractère autre que a-z A-Z 0-9 (.) (_) Et (-).
J'aimerais savoir s'il y a des lacunes dans ma logique ici.
Dans les réponses précédentes, j'ai vu des discussions sur ce qui devrait ou ne devrait pas être échappé. Pour cet exemple, je me suis échappé sans rien m'échapper, mais vous devriez échapper au caractère (-) moins pour être sûr, car elle "brisera" votre expression, sauf si elle se trouve à la fin de la liste . ) Il ne semble pas que le caractère de points soit échappé entre les accolades carrées, mais cela ne vous fera pas de mal si vous y échappez.
Veuillez voir Java Patterns pour plus de détails.
Si vous souhaitez utiliser davantage que [A-Za-z0-9], alors vérifiez Conventions de dénomination MS , et n'oubliez pas de filtrer "... Caractères dont les représentations entières vont de 1 à 31 , ... ".