Ir al contenido principal

Cadenas

Las cadenas son un tipo de expresión usadas para la definición de textos de longitud arbitraria. A través de las cadenas podremos definir todos los textos que sean necesarios en nuestra aplicación. El intérprete de Lua tiene un soporte limitado para la gestión de cadenas y se limita a la definición de cadenas y la concatenación de las mismas. A través de la librería string, tendremos acceso a funciones avanzadas de manipulación que veremos en este artículo.

Definición

Una cadena está formada por una sucesión de caracteres así como una serie de caracteres de control, como por ejemplo, retorno de carro. Una cadena en Lua se puede inicializar de tres formas distintas:

  • Colocando una serie de caracteres entre comillas simples 'cadena'.
  • Colocando una serie de caracteres entre comillas dobles "cadena".
  • Colocando una serie de caracteres entre dobles corchetes [[cadena]].

Este ejemplo a continuación muestra los tres tipos de definición:

cadena1 = "Tutorial de Lua 1"
cadena2 = 'Tutorial de Lua 2'
cadena3 = [[Tutorial de Lua 3]]

print("La cadena 1 es: ", cadena1)
print("La cadena 2 es: ", cadena2)
print("La cadena 3 es: ", cadena3)

El resultado que obtendremos es el siguiente:

La cadena 1 es:         Tutorial de Lua 1
La cadena 2 es:         Tutorial de Lua 2
La cadena 3 es:         Tutorial de Lua 3

Caracteres de escape

Los caracteres de escape son secuencias de caracteres usadas en una cadena de caracteres y que permiten modificar la interpretación de éstos. Por ejemplo, en una cadena delimitada por comillas dobles, queremos usar comillas dobles dentro de la cadena, para ello las comillas dobles las representaremos usando \": "Mi texto \"entre comillas\"". A continuación se muestra una lista de caracteres de escape.

Caracteres de escape
Uso
ASCII (decimal)
\n
New line
10
\r
Carriage return
13
\t
Tab
9
\v
Vertical tab
11
\\

Barra invertida

92

\"
Comillas dobles 34
\'
Comillas simples
39
\[
Corchete izquierdo
91
\]
Corchete derecho
93

Concatenación de cadenas con el operador ..

El operador .. permite la concatenación de cadenas en Lua, concatenando la expresión situada a la derecha del operador, a aquella que se encuentra a su izquierda.

> print("Tutoriales " .. "de " .. "Lua")
Tutoriales de Lua
> cadena = "Tutoriales " .. "de " .. "Lua"
> print(cadena)
Tutoriales de Lua

Manipulación de cadenas en Lua con la librería string

El intérprete de Lua provee un soporte muy limitado de la gestión de cadenas, proveyendo solamente las operaciones de definición y concatenación de cadenas. Para las operaciones más complejas, tales que, extracción de subcadenas, cálculo de longitud, conversiones, etc., Lua dispones de una una serie de funciones que permiten la manipulación de cadenas de una manera sencilla. Estas funciones están definidas en la librería string. A continuación veremos las diferentes funciones con más detalles así como algunos ejemplos de uso.

La funciones de la librería string usan el índice 1. Esto significa que las funciones que devuelven el índice de un caracter, para el primer caracter, devuelven 1 (en otrols lenguajes devuelven 0). 

Contenidos
string.find

string.find(cadena, patrón, [,inicio [,plano)

Busca la primera ocurrencia del patrón en la cadena. Si encuentra el patrón, devuelve un par de valores que contienen la posición de inicio y final. Si no encuentra nada devuelve nil. Por defecto la función string.find permite el uso de patrones de búsqueda, que son similares a las expresiones regulares, pero con limitaciones  y una sintaxis diferente.

> string.find("Tutoriales de Lua en dbtutoriales.com", "Lua")
15      17
> string.find("Tutoriales de Lua en dbtutoriales.com", "Luna")
nil

El parámetro opcional inicio, un entero, permite definir la posición a partir de la cual se quiere realizar la búsqueda. Este parámetro puede ser positivo o negativo, para definir si se quiere empezar por la izquierda (positivo) o por la derecha (negativo).

> string.find("Tutoriales de Lua en dbtutoriales.com", "Lua", 5)
15      17
> string.find("Tutoriales de Lua en dbtutoriales.com", "Lua", 20)
nil
> string.find("Tutoriales de Lua en dbtutoriales.com", "Lua", -25)
15      17

El cuarto parámetro opcional plano, un booleano, permite desactivar el uso de patrones de búsqueda, de este modo los caracteres especiales pasados en patrón, son evaluados como caracteres a buscar y no como caracteres de patrón de búsqueda.

> string.find("Tutoriales de Lua 100% en dbtutoriales.com", "%sL")
14      15
> string.find("Tutoriales de Lua 100% en dbtutoriales.com", "%sL", 1, true)
nil
> string.find("Tutoriales de Lua 100% en dbtutoriales.com", "%", 1, true)
22      22
> string.find("Tutoriales de Lua 100% en dbtutoriales.com", "%")
stdin:1: malformed pattern (ends with '%')
stack traceback:
        [C]: in function 'string.find'
        stdin:1: in main chunk
        [C]: in ?
string.gsub

string.gsub(cadena, patrón, reemplazo [, n)

Devuelve una copia de cadena en la que todas las ocurrencias de patrón han sido reemplazadas por reemplazo. Si se especifica un número en el cuarto parámetro n, se reemplazarán las n ocurrencias de patrón en cadena. Esta función devuelve un segundo valor que representa el número de ocurrencias reemplazadas.

> string.gsub("manzana, piña, plátano", "piña", "pera")
manzana, pera, plátano   1
> string.gsub("manzana, piña, plátano, melón, piña", "piña", "pera")
manzana, pera, plátano, melón, pera     2
> string.gsub("manzana, piña, plátano, melón, piña", "piña", "pera", 1)
manzana, pera, plátano, melón, piña     1
string.format

string.format(formato, arg1, arg2, ..., argn)

Crea una cadena formateada a partir del formato y argumentos proporcionados. formato acepta un número arbitrario de marcadores de formato. El número de argumentos pasados debe coincidir con el número de marcadores pasados. Esta función es similar a la función sprintf() de C.

Los marcadores s y q aceptan valores string. Los marcadores A, a, E, e, f, G y g aceptan valores number. Los marcadores c, d, i, o, u, X y x aceptan valores integer.

> string.format("%c%c%c", 76, 117, 97)                  -- Char (caracter)
Lua
> string.format("%e %E", 2.71828, 2.71828)              -- Exponent (exponente)
2.718280e+000 2.718280E+000
> string.format("%f", 2.71828)                          -- Float (coma flotante)
2.718280
> string.format("%g %g", 2.71828, 10e5)                 -- Float o exponent (según tipo usa uno u otro)
2.71828 1.000000e+006
> string.format("%d %i %u", -10, -10, -10)              -- Signed, signed, unsigned integer (enteros con o sin signo)
-10 -10 18446744073709551606
> string.format("%s %s %q", "Tutoriales", "de", "Lua")  -- String, quoted (cadenas y entre comillas)
Tutoriales de "Lua"
> string.format("%o %x %X", 255, 255, 255)              -- Octal, hexadecimal, hexadecimal
377 ff FF
> string.format("%a %A", 255, 255)                      -- Hexadecimal con exponente binario (>= Lua 5.2)
0x1.fep+7 0X1.FEP+7

El marcador q pone la cadena pasada entre comillas usando caracteres de escape, de tal manera que la cadena devuelta puede ser evaluada de nuevo por el intérprete de Lua sin producir errores.

> string.format("%s %q %s", "Aprendiendo", "Lua", "con dbtutoriales.com")
Aprendiendo "Lua" con dbtutoriales.com
string.upper

string.upper(cadena)

Devuelve una copia de cadena en la que todas sus letras han sido convertidas a mayúsculas.

> string.upper("Tutoriales de Lua en dbtutoriales.com")
TUTORIALES DE LUA EN DBTUTORIALES.COM
string.lower

string.lower(cadena)

Devuelve una copia de cadena en la que todas sus letras han sido convertidas a minúsculas.

> string.lower("Tutoriales de Lua en dbtutoriales.com")
tutoriales de lua en dbtutoriales.com
string.reverse

string.reverse(cadena)

Devuelve una copia de cadena invertida

> string.reverse("Tutorial de Lua")
auL ed lairotuT
string.byte

string.byte(cadena [, inicio [, fin)

Devuelve el valor numérico de los caracteres comprendidos entre inicio y fin de cadena, ambos comprendidos, en la codificación ASCII. Si no se especifica inicio, se devuelve el valor del primer carácter. Se puede decir que es la función inversa de string.char().

> string.byte("Lua")
76
> string.byte("Lua", 2)
117
> string.byte("Lenguaje Lua", 5, 10)            -- Devuelve los carácteres comprendidos entre 5 y 10 ambos incluidos, total 6 carácteres
117     97      106     101     32      76
> string.byte(" ")
32
string.char

string.char(i1, i2, ... in)

Devuelve una cadena representando los valores numéricos de carácter ASCII pasados como argumentos. Se puede decir que es la operación inversa de la función string.byte();

> string.char(76, 117, 97)
Lua
string.len

string.len(cadena)

Devuelve la longitud de la cadena.

> string.len("Tutoriales de Lua")
17
string.rep

string.rep(cadena, n)

Devuelve una cadena en la que cadena aparece concatenado n veces.

> string.rep("Lua ", 3)
Lua Lua Lua
> string.rep("Lua\n", 3)
Lua
Lua
Lua

Método Uso y ejemplos
string.upper(c)
Devuelve una copia de la cadena c en la que todas las letras son convertidas a mayúsculas.
string.lower(cadena)
Convierte todos los caracteres a minúscula. Se pasa la cadena a convertir como argumento.
string.gsub (cadena, busqueda, reemplazo, ocurrencias)

Remplaza cada ocurrencia encontrada de busqueda en cadena por reemplazo. Si ocurrencias, se define, se reemplazarán el número definido de ocurrencias. Ejemplo:

> string.gsub("00000", "0", "1", 4)
11110   4
string.strfind(cadena,