2011-05-17 28 views
5

Tengo una cadena como first part;second part. Quiero dividirlo en el ; y devolver la segunda parte. Todo funciona bien con:dividir una cadena en un separador

start = mystring:find(';') 
result = mystring:sub(start) 

pero esperaba hacerlo en una línea:

result = mystring:sub(mystring:find(';')) 

No emite un error pero no devuelve el resultado esperado. No es un gran problema, ya que funciona bien en dos líneas de código, pero entender por qué no funciona en el oneliner me ayudará a comprender mejor cómo funciona lua.

Respuesta

1

Esto también funcionará:

result = mystring:sub((mystring:find(';'))) 

Los paréntesis adicionales aseguran que sub se llama con un único argumento, por lo usará el valor predeterminado (el final de mystring) para el segundo argumento.

3

find en realidad devuelve dos valores, que son los índices de inicio y final de donde se encuentra la cadena que buscó. En este caso, ambos índices son 11.
Cuando pasa estos dos índices a sub, obtiene una subcadena que comienza y termina en 11, por lo que solo obtiene ';'.

+0

¿Y alguna magia para pasar solo el primer índice a la función sub() sin asignarlo primero a una variable? Me gusta 'mystring: sub (mystring: find (';') [1])' (que, por supuesto, no funciona) – ripat

+0

@ripat lhf ya respondió esto. También eche un vistazo a esta página: [http://lua-users.org/wiki/SplitJoin](http://lua-users.org/wiki/SplitJoin). Puede obtener más información sobre una mejor solución, por si acaso su cadena tiene más de dos partes, por ejemplo. – Zecc

3

Prueba esto:

s="first part;second part" 
print(s:match(";(.-)$")) 

o esto:

print(s:sub(s:find(";")+1,-1)) 
+0

De hecho, menos detallado. Pero tiendo a evitar el uso de expresiones regulares que son generalmente más lentas que las funciones de cadena. En cuanto a la función match(), ¿no sería suficiente el patrón ''; (.-) $''? – ripat

+0

Acabo de hacer un poco de tiempo y encontrar + sub es aproximadamente 6 veces más rápido que el partido en este caso. Así que me quedaré con la cosa de find + sub. – ripat

+0

@ripat, de hecho. He editado mi respuesta. – lhf

Cuestiones relacionadas