Regex pour remplacer les caractères que Windows ne l'accepte pas dans un nom de fichier
Je suis en train de construire une expression régulière qui permet de détecter tous les caractères que Windows n'accepte pas qu'une partie d'un nom de fichier (ce sont les mêmes pour les autres OS? Je ne sais pas, pour être honnête).
Ces symboles sont:
\ /: * ? "|
De toute façon, c'est ce que j'ai: [\\/:*?\"<>|]
Le testeur sur au http://gskinner.com/RegExr/ montre de ce travail.
Pour la chaîne Allo*ha
, le *
symbole s'allume, la signalisation, il a été trouvé. Dois-je saisir Allo**ha
toutefois, seul le premier *
s'allume. Donc, je pense que j'ai besoin de modifier cette regex pour trouver toutes les apparences des personnages, mais je ne suis pas sûr.
Vous voir, en Java, je suis assez chanceux pour avoir la fonction Chaîne de caractères.replaceAll(String regex, Chaîne de remplacement).
La description dit:
Remplace chaque sous-chaîne de la chaîne qui correspond à l'expression régulière donnée avec la donnée de remplacement.
Donc, en d'autres termes, même si la regex ne trouve que la première, puis arrête la recherche, cette fonction sera encore les trouver tous.
Par exemple: String.replaceAll("[\\/:*?\"<>|]","")
Cependant, je ne me sens pas que je peux prendre ce risque. Si quelqu'un sait comment je peux étendre cette?
- -1 en faire une qeustion et de nous dire la langue ou le contexte que vous utilisez et je vais vous donner votre vote à l'arrière
- Je voudrais aussi savoir ce que la langue de votre aide.
- Sachez que, parce que votre regex est sous la forme d'une application Java littéral de chaîne, vous devez double-barres obliques inverses: "[\\\\/:*?\"<>|]". La façon dont vous l'aviez, vous étiez juste de s'échapper de la barre oblique (ce qui n'est pas nécessaire, mais ce n'est pas une erreur).
- Encore une chose: Si vous essayez de créer regexes qui fonctionne en Java native de regex, vous devez utiliser un testeur qui est alimenté par Java, comme celui-ci: fileformat.info/tool/regex.htm (RegExr utilise ActionScript du moteur d'expressions régulières.)
- Vous pouvez également essayer différents de la Chaîne.replaceAll() dans la série comme ceci: YourString.replaceAll("[^A-Za-z0-9_.\\s-" + Fichier.séparateur + "]*", "").replaceAll("^\\s", "").replaceAll("\\s$", ""));
- Quelle est la meilleure expression régulière qui va permettre à autant de caractères pris en charge que possible , sur Linux (ou, plus précisément, sur Android) ?
- Voir aussi stackoverflow.com/questions/1155107/...
Vous devez vous connecter pour publier un commentaire.
Windows nom de fichier de règles sont difficile. Vous êtes seulement gratter la surface.
Par exemple, ici, sont quelques-uns des choses qui ne sont pas valides pour les noms de fichiers, en plus de la chracters répertorié:
La suppression des caractères spéciaux dans une seule regex sous comme Chaîne de caractères.replaceAll() n'est pas suffisante, vous pouvez facilement vous retrouver avec quelque chose invalide comme une chaîne vide ou de fuite ‘.’ ou‘. Le remplacement de quelque chose comme “[^A-Za-z0-9_.]*” avec " _ " serait une meilleure première étape. Mais vous aurez toujours besoin de plus haut niveau de traitement sur quelle que soit la plateforme que vous utilisez.
depuis pas de réponse a été assez bonne, je l'ai fait moi-même. espérons que cette aide 😉
trim
ming pour éviter la tête ou à la fin de l'espace- Je utiliser de la pure et simple expression régulière.
Je donne des caractères qui peuvent se produire et, à travers la négation de "^" je change de tous les autres comme un signe de cette. "_"
Par exemple:
Si vous ne voulez pas être l'expression d'un "." dans puis de supprimer le "\\."
\w stands for "word character". It always matches the ASCII characters [A-Za-z0-9_]
[^\w\.!@#$^+=-]
Pour l'enregistrement, conforme à POSIX systèmes (y compris la UNIX et Linux) en charge tous les caractères sauf le caractère null (
'\0'
) et slash ('/'
) dans les noms de fichiers. Les caractères spéciaux tels que l'espace et l'astérisque doit être échappé sur la ligne de commande de sorte qu'ils ne prennent pas leurs rôles habituels.Java a une fonction replaceAll, mais chaque langage de programmation a moyen de faire quelque chose de similaire. Perl, par exemple, utilise le
g
interrupteur pour signifier un remplacement global. Pythonsub
fonction vous permet de spécifier le nombre de remplacements à effectuer. Si, pour une raison quelconque, votre langue n'a pas ont un équivalent, vous pouvez toujours faire quelque chose comme ceci:J'ai extrait tous les caractères de mot et les espaces de la chaîne d'origine et j'ai aussi assurez-vous que les espaces de caractère n'est pas présent à la fin de la chaîne. Voici mon extrait de code en java.
Je pense que j'ai aidé quelqu'un.
Vous pouvez essayer en ne permettant que les choses que vous voulez que l'utilisateur puisse entrer, par exemple, A-Z, a-z et 0-9.
Vous ne pouvez pas faire cela avec un seul regexp, car une expression régulière correspond toujours à une sous-chaîne si l'entrée. Considérer le mot
Alo*h*a
, il n'y a pas de sous-chaîne qui contient tous les*
s, et pas n'importe quel autre caractère. Donc, si vous pouvez utiliser la fonction replaceAll, il suffit de coller avec elle.BTW, l'ensemble des caractères interdits est différente dans d'autres Systèmes d'exploitation.
J'en ai fait une très méthode simple qui fonctionne pour moi, pour les cas les plus courants:
%22 est codé si vous avez qoute (") dans les noms de fichier.
Le nécessaire regex /syntaxe (JS):
où le dernier bit est facultatif, à utiliser uniquement si vous voulez limiter la longueur de 240.
d'autres fonctions utiles (JS):
Windows aussi ne pas accepter "%" comme un nom de fichier.
Si vous êtes à la construction d'une expression générale qui peuvent affecter les fichiers qui seront par la suite transférés à d'autres système d'exploitation, je vous suggère de mettre plus de caractères qui peuvent avoir de problèmes avec eux.
Par exemple, sous Linux (beaucoup de distributions, je le sais), certains utilisateurs peuvent avoir des problèmes avec les fichiers contenant [b]& ! ] [ /- ( )[/b]. Les symboles sont autorisés dans les noms de fichiers, mais ils peuvent avoir besoin d'être spécialement traitée par les utilisateurs et certains programmes ont des bugs causés par leur existence.