¿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
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:
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í:
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:
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í:
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.