J'ai un regexp pour valider les noms de fichiers. Voici:
/[0-9a-zA-Z\^\&\'\@\{\}\[\]\,\$\=\!\-\#\(\)\.\%\+\~\_ ]+$/
Il devrait permettre des noms de fichiers comme ceci:
aaa aaa.ext a# A9#.ext
Les caractères suivants ne sont pas autorisés \ / : * ? \" < > |
\ / : * ? \" < > |
Le problème est que les noms de fichiers comme *.txt
ou /\kk
passent la validation. Je fais une validation avec l'événement keyup. Donc, quand j'ai mis un personnage supplémentaire après l'absence de celui-ci, il montre que tout est correct.
Vous devez ajouter une ancre de départ:
/^[0-9a-zA-Z ... ]+$/
Cela indique au moteur de faire correspondre dès le début de la saisie jusqu'au bout de l'entrée, alors que pour votre expression d'origine, il suffit de correspondre à la fin de l'entrée.
Pour les noms Windows.
var isValid=(function(){ var rg1=/^[^\\/:\*\?"<>\|]+$/; // forbidden characters \ / : * ? " < > | var rg2=/^\./; // cannot start with dot (.) var rg3=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i; // forbidden file names return function isValid(fname){ return rg1.test(fname)&&!rg2.test(fname)&&!rg3.test(fname); } })(); isValid('file name');
Vous devez ancrer l'expression en utilisant ^
et $
. Par exemple:
/^[-\w^&'@{}[\],$=!#().%+~ ]+$/
Notez que vous devez échapper -
dans une classe de personnage, ou placez-le en premier / dernier.
/^(?!\.)(?!com[0-9]$)(?!con$)(?!lpt[0-9]$)(?!nul$)(?!prn$)[^\|\*\?\\:<>/$"]*[^\.\|\*\?\\:<>/$"]+$/ Must not be empty. Must not start with . Must not be com0-com9, con, lpt0-lpt9, nul, prn Must not contain | * ? \ : < > $ Must not end with .
Je voudrais essayer quelque chose avec ce Regex (vous pouvez même créer un attribut de validation pour ASP.NET MVC avec lui!):
@"^[^\u0022\u003C\u003E\u007C\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u003A\u002A\u003F\u005C\u002F]*$"
Si elle correspond à l'entrée, il s'agit d'un nom de fichier valide (au moins sous Windows).