es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo dividir una cadena en una ‘tupla’ de nombre de archivo y extensión solo usando expresiones regulares?

Sé que hay formas más fáciles de obtener extensiones de archivo con JavaScript, pero en parte para practicar mis habilidades de expresión regular, quería intentar usar una expresión regular para dividir un nombre de archivo en dos cadenas, antes y después del último punto (carácter .).

Esto es lo que tengo hasta ahora:

const myRegex = /^((?:[^.]+(?:\.)*)+?)(\w+)?$/
const [filename1, extension1] = 'foo.baz.bing.bong'.match(myRegex);
// filename1 = 'foo.baz.bing.'
// extension1 = 'bong'
const [filename, extension] = 'one.two'.match(myRegex);
// filename2 = 'one.'
// extension2 = 'two'
const [filename, extension] = 'noextension'.match(myRegex);
// filename2 = 'noextension'
// extension2 = ''

He intentado usar una “negative lookahead” para decir “solo emparejar un punto literal si está seguido por una palabra que termina en …”, así es como se ve:

/^((?:[^.]+(?:\.(?=(\w+\.))))*)(\w+)$/gm

Pero quiero excluir ese punto final usando solo la expresión regular, y preferiblemente que “noextension” sea emparejado en el grupo inicial, ¿cómo puedo hacerlo solo con expresiones regulares?

Aquí está mi archivo de regex: https://regex101.com/r/RTPRNU/1

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Obteniendo extensiones de archivo con JavaScript usando expresiones regulares

    A veces, puede que desee usar expresiones regulares para dividir un nombre de archivo en dos cadenas antes y después del último carácter del punto (.) Esto puede ser una buena manera de practicar sus habilidades de regex, aunque hay formas más fáciles de obtener extensiones de archivo con JavaScript.

    Aquí hay un ejemplo de una expresión regular que puede usar para dividir un nombre de archivo y su extensión:

    const myRegex = /^((?:[^.]+(?:\.)*)+?)(\w+)?$/;
    

    Esta expresión regular utiliza un grupo que no captura (?:[^.]+(?:\.)*)+? para hacer coincidir el nombre de archivo antes del punto final. Captura la extensión utilizando el grupo (\w+)?.

    Puede usar esta expresión regular para dividir nombres de archivo y sus extensiones, así:

    const [filename1, extension1] = 'foo.baz.bing.bong'.match(myRegex);
    // filename1 = 'foo.baz.bing.'
    // extension1 = 'bong'
    
    const [filename2, extension2] = 'one.two'.match(myRegex);
    // filename2 = 'one.'
    // extension2 = 'two'
    
    const [filename3, extension3] = 'noextension'.match(myRegex);
    // filename3 = 'noextension'
    // extension3 = ''
    

    Sin embargo, si desea excluir el punto final del nombre de archivo, puede modificar la expresión regular y usar una apariencia positiva para hacer coincidir el punto final solo si le sigue un carácter de palabra:

    const myRegex2 = /^((?:[^.]+(?:\.(?=\w))*)+?)(\w+)?$/;
    

    Esta expresión regular hace coincidir el nombre de archivo antes del punto final utilizando el grupo que no captura (?:[^.]+(?:\.(?=\w))*)+?, que hace coincidir cualquier cantidad de caracteres que no sean de punto seguidos de un punto que inmediatamente le sigue un carácter de palabra.

    Puede usar esta expresión regular modificada para dividir nombres de archivo y sus extensiones, así:

    const [filename1, extension1] = 'foo.baz.bing.bong'.match(myRegex2);
    // filename1 = 'foo.baz.bing'
    // extension1 = 'bong'
    
    const [filename2, extension2] = 'one.two'.match(myRegex2);
    // filename2 = 'one'
    // extension2 = 'two'
    
    const [filename3, extension3] = 'noextension'.match(myRegex2);
    // filename3 = 'noextension'
    // extension3 = ''
    

    Tenga en cuenta que si el archivo no tiene extensión, la expresión regular aún capturará el nombre de archivo, pero la extensión será una cadena vacía.

Comments are closed.