2011-03-09 19 views
14

Tengo un nombre de archivo estándar de Windows con ruta de acceso. Necesito dividir el nombre de archivo, la extensión y la ruta de la cadena.¿Cuál es la mejor manera de dividir un nombre de ruta en sus componentes en Lua

Actualmente estoy simplemente leyendo la cadena hacia atrás desde el final buscando. cortar la extensión y la primera \ para obtener la ruta.

Estoy seguro de que debería poder hacer esto usando un patrón Lua, pero sigo fallando cuando se trata de trabajar desde la derecha de la cuerda.

por ejemplo. c: \ temp \ test \ miarchivo.txt debe devolver

  • c: \ temp \ test \
  • miarchivo.txt
  • txt

Gracias de disculpas de antemano si esta es un duplicado, pero podría encontrar muchos ejemplos para otros idiomas, pero no para Lua.

+1

yo diría simplemente leyendo la cadena hacia atrás es una mejor manera de hazlo: la coincidencia de patrones es excesiva en esta situación, probablemente se ejecutará 10 veces más lento y tardará más tiempo en captarse una vez que estés en un estado de mantenimiento y hayas olvidado cada detalle de tu código. – sbk

Respuesta

15
> return string.match([[c:\temp\test\myfile.txt]], "(.-)([^\\]-([^%.]+))$") 
c:\temp\test\ myfile.txt txt 

Esto parece hacer exactamente lo que quiere.

+0

Muchas gracias, no quiere saber cuánto tiempo jugué con la cadena de partido, voy a trabajar con su respuesta para aprender cómo funciona. –

+1

@Jane: las cosas importantes a tener en cuenta son los '' 'no codiciosos y su ubicación. – Arrowmaster

0

Split string in Lua?

Hay unos cuantos cadena para funciones de tabla allí, split "\" como \ puedo estar en un nombre de carpeta de todas formas por lo que va a terminar con una mesa con el índice uno de ellos la unidad y el último índice siendo el archivo.

26

Aquí es una versión mejorada que funciona para rutas de Windows y Unix, y también trata los archivos sin puntos (o archivos con múltiples puntos):

= string.match([[/mnt/tmp/myfile.txt]], "(.-)([^\\/]-%.?([^%.\\/]*))$") 
"/mnt/tmp/" "myfile.txt" "txt" 

= string.match([[/mnt/tmp/myfile.txt.1]], "(.-)([^\\/]-%.?([^%.\\/]*))$") 
"/mnt/tmp/" "myfile.txt.1" "1" 

= string.match([[c:\temp\test\myfile.txt]], "(.-)([^\\/]-%.?([^%.\\/]*))$") 
"c:\\temp\\test\\" "myfile.txt" "txt" 

= string.match([[/test.i/directory.here/filename]], "(.-)([^\\/]-%.?([^%.\\/]*))$") 
"/test.i/directory.here/" "filename" "filename" 
Cuestiones relacionadas