2011-07-05 12 views
22

La siguiente expresión regularJavascript expresiones regulares de extensión coincidente/archivo de extracción

var patt1=/[0-9a-z]+$/i; 

extrae la extensión de archivo de cadenas como

filename-jpg 
filename#gif 
filename.png 

cómo modificar esta expresión regular para devolver sólo una extensión cuando en realidad cuerdas es un nombre de archivo con un punto como separador? (Obviamente el nombre de archivo # gif no es un nombre de archivo regular)

actualización basada en los comentarios de tvanofsson me gustaría aclarar que cuando la función JS recibe la cadena, la cadena ya contendrá un nombre de archivo sin espacios y sin los puntos y otros especiales caracteres (en realidad se manejará un slug). El problema no estaba en el análisis de nombres de archivo sino en el análisis incorrecto de slugs: la función devolvía una extensión de "jpg" cuando se le daba "filename-jpg" cuando realmente debería devolver null o una cadena vacía y es este comportamiento el que necesitaba ser corregido

+3

¿La expresión regular debe determinar si el nombre del archivo es un nombre de archivo legal? ¿Qué define un nombre de archivo legal? ¿Qué define una extensión de nombre de archivo legal? Por ejemplo, es 'foo bar.zi_' un nombre de archivo legal? ¿Qué tal 'foo.bar.zi_'? – tvanfosson

+0

El nombre de archivo del sistema operativo típico ... su ejemplo con espacio no puede suceder en nuestro sistema y la respuesta proporcionada por @stema parece funcionar con extensiones dobles, por lo que es lo suficientemente bueno para mí. – mare

+1

Ambos ejemplos son nombres de archivos legales en Unix y Windows. Su pregunta podría mejorarse detallando exactamente lo que considera que es un nombre de archivo legal. Hará las respuestas, esp. la respuesta aceptada es más significativa para los lectores futuros que puedan estar buscando resolver el mismo problema o uno similar. – tvanfosson

Respuesta

44

Sólo tiene que añadir . a la expresión regular

var patt1=/\.[0-9a-z]+$/i; 

Debido a que el punto es un carácter especial en expresiones regulares que necesita para escapar de ella para que coincida literalmente: \..

Su patrón ahora coincidirá con cualquier cadena que termine con un punto seguido de al menos un carácter de [0-9a-z].

p. Ej.

foobar.a
foobar.txt
foobar.foobar1234

si desea limitar la extensión de una cierta cantidad de personajes también, de lo que necesita para reemplazar el +

var patt1=/\.[0-9a-z]{1,5}$/i; 

permitiría al menos 1 y como máximo 5 caracteres después del punto.

+0

¿Qué sucede si no necesito el punto en mi pareja y solo la extensión? – user2727195

+0

@ user2727195 Sin el punto, no estás haciendo coincidir una extensión. Si te refieres a ... cómo usas solo el texto resultante, entonces podrías usar la subcadena, así: '((" file.ext "). Match (patt1) || '') .substring (1);' – Armstrongest

34

Trate

var patt1 = /\.([0-9a-z]+)(?:[\?#]|$)/i; 

con esta expresión regular es útil para extraer las extensiones de archivo de la URL - incluso los que tienen ?foo=1 cadenas de consulta y #hash terminaciones.

También le proporcionará la extensión como $1.

var m1 = ("filename-jpg").match(patt1); 
alert(m1); // null 

var m2 = ("filename#gif").match(patt1); 
alert(m2); // null 

var m3 = ("filename.png").match(patt1); 
alert(m3); // [".png", "png"] 

var m4 = ("filename.txt?foo=1").match(patt1); 
alert(m4); // [".txt?", "txt"] 

var m5 = ("filename.html#hash").match(patt1); 
alert(m5); // [".html#", "html"] 

P. S. +1 para @stema quién offers pretty good advice en algunos de los principios básicos de sintaxis de RegExp involucrados.

+0

Gracias amigo :-) – ianaz

7

lista Ejemplo:

var fileExtensionPattern = /\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/gmi 
//regex flags -- Global, Multiline, Insensitive 

var ma1 = 'css/global.css?v=1.2'.match(fileExtensionPattern)[0]; 
console.log(ma1); 
// returns .css 

var ma2 = 'index.html?a=param'.match(fileExtensionPattern)[0]; 
console.log(ma2); 
// returns .html 

var ma3 = 'default.aspx?'.match(fileExtensionPattern)[0]; 
console.log(ma3); 
// returns .aspx 

var ma4 = 'pages.jsp#firstTab'.match(fileExtensionPattern)[0]; 
console.log(ma4); 
// returns .jsp 

var ma5 = 'jquery.min.js'.match(fileExtensionPattern)[0]; 
console.log(ma5); 
// returns .js 

var ma6 = 'file.123'.match(fileExtensionPattern)[0]; 
console.log(ma6); 
// returns .123 

Test page.

Cuestiones relacionadas