2012-06-19 37 views
8

Tengo una expresión regular para validar los nombres de los archivos. Aquí es:Javascript regex para validar nombres de archivo

/[0-9a-zA-Z\^\&\'\@\{\}\[\]\,\$\=\!\-\#\(\)\.\%\+\~\_ ]+$/ 

Debe permitir nombres de archivo como este:

aaa 
aaa.ext 
a# 
A9#.ext 

Los siguientes caracteres no están permitidos \/: * ? \" < > |

El problema es que los nombres de archivo como *.txt o /\kk pasa la validación . Estoy haciendo la validación con el evento de teclado. Entonces cuando pongo un personaje extra después de no permitir uno, muestra que todo está correcto.

Respuesta

7

es necesario agregar un ancla de partida:

/^[0-9a-zA-Z ... ]+$/ 

Esto le dice al motor para que coincida con el inicio de la entrada de todo el camino hasta el final de la entrada, mientras que para su expresión original que sólo necesita coincidir al final de la entrada.

6

Debe delimitar la expresión utilizando ^ y $. Por ejemplo:

/^[-\w^&'@{}[\],$=!#().%+~ ]+$/ 

Tenga en cuenta que tiene que escapar - en una clase de caracteres, o colocarlo primero/último.

24

Para nombres de 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'); 
+1

Escape/con \ en rg1. Al menos, VS 2010 piensa que sí. – noober

+1

^(?! \.) (?! com [0-9] $) (?! con $) (?! lpt [0-9] $) (?! nul $) (?! prn $) [^ \ | \ * \? \\: <>/$ "] * [^ \. \ | \ * \? \\: <>/$"] + $ –

+0

Gracias @RyanWilliams por sus comentarios. Pero sé cómo crear un archivo en Windows con un nombre de archivo largo que contenga un punto al final del nombre del archivo y sin extensión :) –

2
/^(?!\.)(?!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 . 
0

me gustaría probar algo con esta expresión regular (incluso se puede hacer un atributo de validación de ASP.NET MVC con él!):

@"^[^\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 coincide con la entrada, es nombre de archivo válido (al menos en Windows).

Cuestiones relacionadas