Cadenas de Lua
Una cadena o string está compuesta por una serie de caracteres formados por números, letras y guiones bajos.
En Lua, las cadenas son un tipo de datos básico que se utiliza para almacenar datos de texto.
Las cadenas en Lua pueden contener cualquier carácter, incluyendo letras, números, símbolos, espacios y otros caracteres especiales.
En el lenguaje Lua, las cadenas se pueden representar de las siguientes tres maneras:
Una secuencia de caracteres entre comillas simples.
local str1 = 'This is a string.' local str2 = "This is also a string."
Una secuencia de caracteres entre comillas dobles.
local str = "Hello, " str = str .. "World!" -- 创建一个新的字符串并将其赋值给str print(str) -- 输出 "Hello, World!"
[[y]]Una secuencia de caracteres entre ...
local multilineString = [[ This is a multiline string. It can contain multiple lines of text. No need for escape characters. ]] print(multilineString)
A continuación se muestran ejemplos de cadenas con estos tres métodos:
Ejemplo
print("\"La cadena 1 es\"",string1)
string2 = 'example.com'
print("La cadena 2 es",string2)
string3 = [["Tutorial de Lua"]]
print("La cadena 3 es",string3)
El resultado de ejecutar el código anterior es:
"字符串 1 是" Lua 字符串 2 是 example.com 字符串 3 是 "Lua 教程"
Cálculo de longitud de cadenas
En Lua, para calcular la longitud de una cadena (es decir, el número de caracteres de la cadena), puedes usar lastring.lenfunción o lautf8.lenfunción; en general, para cadenas que contienen chino se usautf8.len,string.lenLa función se utiliza para calcular la longitud de cadenas que solo contienen caracteres ASCII.
Ejemplo
-- Calcula la longitud de la cadena (número de caracteres)
local length = string.len(myString)
print(length) -- Muestra 14
La cadena myString del ejemplo anterior solo contiene caracteres ASCII, por lo que lastring.lenfunción puede devolver correctamente la longitud de la cadena.
Para cadenas que contienen chino se usa lautf8.lenfunción:
Ejemplo
-- Calcula la longitud de la cadena (número de caracteres)
local length1 = utf8.len(myString)
print(length1) -- Muestra 10
-- la función string.len produce un resultado inexacto
local length2 = string.len(myString)
print(length2) -- Muestra 14
El resultado es:
10 14
Los caracteres de escape se utilizan para representar caracteres que no se pueden mostrar directamente, como la tecla de retroceso, la tecla Enter, etc. Por ejemplo, para escapar comillas dobles en una cadena se puede usar\。
Todos los caracteres de escape y sus significados correspondientes:
Carácter de escape
| Significado
| Valor del código ASCII (decimal)
|
\a
| Campana (BEL)
| 007
|
\b
| Retroceso (BS): mueve la posición actual a la columna anterior
| 008
|
\f
| Salto de página (FF): mueve la posición actual al inicio de la página siguiente
| 012
|
\n
| Salto de línea (LF): mueve la posición actual al inicio de la línea siguiente
| 010
|
\r
| Retorno de carro (CR): mueve la posición actual al inicio de la línea actual
| 013
|
\t
| Tabulación horizontal (HT): salta a la siguiente posición TAB
| 009
|
\v
| Tabulación vertical (VT)
| 011
|
\\
| Representa un carácter de barra invertida '\'
| 092
|
\'
| Representa un carácter de comilla simple (apóstrofo)
| 039
|
\"
| Representa un carácter de comilla doble
| 034
|
\0
| Carácter nulo (NULL)
| 000
|
\ddd
| Cualquier carácter representado por un número octal de 1 a 3 dígitos
| Tres dígitos octales
|
\xhh
| Cualquier carácter representado por un número hexadecimal de 1 a 2 dígitos
| Dos dígitos hexadecimales
|
Operaciones con cadenas
Lua proporciona muchos métodos para operar con cadenas:
| N.º | Método y uso |
|---|---|
| 1 | string.upper(argument): Convierte toda la cadena a mayúsculas. |
| 2 | string.lower(argument): Convierte toda la cadena a minúsculas. |
| 3 | string.gsub(mainString,findString,replaceString,num) Reemplaza dentro de una cadena. mainString es la cadena sobre la que se opera, findString es el carácter que se reemplaza, replaceString es el carácter de reemplazo, num es el número de reemplazos (se puede omitir; si se omite, se reemplazan todos), por ejemplo:
> string.gsub("aaaa","a","z",3);
zzza 3
|
| 4 | string.find (str, substr, [init, [plain]]) Busca el contenido especificado substr en la cadena objetivo str. Si encuentra una subcadena que coincide, devuelve el índice inicial y final de la subcadena; si no existe, devuelve nil. initEspecifica la posición inicial de la búsqueda; el valor predeterminado es 1. Puede ser un número negativo, que indica el número de caracteres contados desde el final hacia el principio. plainIndica si se utiliza el modo simple; el valor predeterminado es false. true solo realiza una búsqueda simple de subcadenas; false indica que se utiliza el modo de coincidencia de patrones (expresiones regulares). El siguiente ejemplo busca las posiciones de los índices inicial y final de la cadena "Lua":
> string.find("Hello Lua user", "Lua", 1)
7 9
|
| 5 | string.reverse(arg) Inversión de cadenas
> string.reverse("Lua")
auL |
| 6 | string.format(...) Devuelve una cadena formateada similar a printf
> string.format("the value is:%d",4)
the value is:4
|
| 7 | string.char(arg) y string.byte(arg[,int]) char convierte números enteros en caracteres y los concatena; byte convierte caracteres en valores enteros (se puede especificar un carácter; por defecto, el primer carácter).
> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
>
|
| 8 | string.len(arg) Calcula la longitud de la cadena.
string.len("abc")
3
|
| 9 | string.rep(string, n) Devuelve n copias de la cadena string
> string.rep("abcd",2)
abcdabcd
|
| 10 | .. Concatena dos cadenas
> print("www.ejemplo.".."com")
www.example.com
|
| 11 | string.gmatch(str, pattern) Devuelve una función iteradora. Cada vez que se llama a esta función, devuelve la siguiente subcadena encontrada en el string str que coincida con la descripción de pattern. Si no se encuentra ninguna cadena que coincida con pattern, la función iteradora devuelve nil.
> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
|
| 12 | string.match(str, pattern, init) string.match() solo busca la primera coincidencia en la cadena fuente str. El parámetro init es opcional y especifica el punto de inicio de la búsqueda; el valor predeterminado es 1. Cuando la coincidencia es exitosa, la función devuelve todos los resultados capturados en la expresión de coincidencia; si no se ha establecido una marca de captura, devuelve toda la cadena coincidente. Cuando no hay una coincidencia exitosa, devuelve nil.
> = string.match("I have 2 questions for you.", "%d+ %a+")
2 questions
> = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
2, "questions"
|
Extracción de subcadenas
La extracción de subcadenas utiliza el método sub().
string.sub() se utiliza para extraer una subcadena; su prototipo es:
string.sub(s, i [, j])
Descripción de parámetros:
- s: la cadena que se va a extraer.
- i: la posición inicial de extracción.
- j: la posición final de extracción; el valor predeterminado es -1, el último carácter.
Ejemplo
-- Cadena
local sourcestr = "prefix--ejemplogoogletaobao--suffix"
print("\n"Cadena original", string.format("%q", sourcestr))
-- Se extrae una parte, del 4.º al 15.º
local first_sub = string.sub(sourcestr, 4, 15)
print("\n"Primera extracción", string.format("%q", first_sub))
-- Tomar el prefijo de la cadena, del 1.º al 8.º
local second_sub = string.sub(sourcestr, 1, 8)
print("\n"Segunda extracción", string.format("%q", second_sub))
-- Extraer los últimos 10 caracteres
local third_sub = string.sub(sourcestr, -10)
print("\n"Tercera extracción", string.format("%q", third_sub))
-- Índice fuera de rango, se muestra la cadena original
local fourth_sub = string.sub(sourcestr, -100)
print("\n"Cuarta extracción", string.format("%q", fourth_sub))
El resultado de ejecutar el código anterior es:
原始字符串 "prefix--ejemplogoogletaobao--suffix" 第一次截取 "fix--ejemplog" 第二次截取 "prefix--" 第三次截取 "ao--suffix" 第四次截取 "prefix--ejemplogoogletaobao--suffix"
Conversión de mayúsculas y minúsculas de cadenas
El siguiente ejemplo demuestra cómo convertir mayúsculas y minúsculas en una cadena:
Ejemplo
print(string.upper(string1))
print(string.lower(string1))
El resultado de ejecutar el código anterior es:
LUA lua
Búsqueda e inversión de cadenas
El siguiente ejemplo demuestra cómo realizar operaciones de búsqueda e inversión en cadenas:
Ejemplo
-- Búsqueda de cadena
print(string.find(string,"Tutorial"))
reversedString = string.reverse(string)
print("La nueva cadena es",reversedString)
El resultado de ejecutar el código anterior es:
5 12 新字符串为 lairotuT auL
Formato de cadenas
Lua proporcionastring.format()funciones para generar cadenas con un formato específico. El primer parámetro de la función es el formato, seguido de varios datos correspondientes a cada marcador del formato.
Gracias a la cadena de formato, la legibilidad de las cadenas largas generadas mejora considerablemente. El formato de esta función se parece mucho al printf() del lenguaje C.
El siguiente ejemplo demuestra cómo dar formato a cadenas:
La cadena de formato puede contener los siguientes códigos de formato:
- %c - Acepta un número y lo convierte al carácter correspondiente de la tabla ASCII.
- %d, %i - Acepta un número y lo convierte a un formato de entero con signo.
- %o - Acepta un número y lo convierte a un formato de número octal.
- %u - Acepta un número y lo convierte a un formato de entero sin signo.
- %x - Acepta un número y lo convierte a un formato de número hexadecimal, usando letras minúsculas.
- %X - Acepta un número y lo convierte a un formato de número hexadecimal, usando letras mayúsculas.
- %e - Acepta un número y lo convierte a un formato de notación científica, usando la letra e minúscula.
- %E - Acepta un número y lo convierte a un formato de notación científica, usando la letra E mayúscula.
- %f - Acepta un número y lo convierte a un formato de número de punto flotante.
- %g(%G) - Acepta un número y lo convierte al formato más corto entre %e (%E, correspondiente a %G) y %f.
- %q - Acepta una cadena y la convierte a un formato que el compilador de Lua puede leer de forma segura.
- %s - Acepta una cadena y la formatea según los parámetros dados.
Para refinar aún más el formato, se pueden añadir parámetros después del signo %. Los parámetros se leen en el siguiente orden:
- (1) Signo: un signo + indica que el especificador numérico siguiente hará que los positivos muestren el signo más. Por defecto solo los negativos muestran signo.
- (2) Relleno: un 0, que se usa como relleno cuando se especifica el ancho de la cadena. Si no se indica, el relleno por defecto es un espacio.
- (3) Indicador de alineación: cuando se especifica el ancho de la cadena, por defecto se alinea a la derecha; añadiendo un signo - se puede cambiar a alineación a la izquierda.
- (4) Valor del ancho
- (5) Decimales / truncamiento de cadena: la parte decimal n añadida después del valor de ancho. Si va seguida de f (especificador de coma flotante, como %6.3f), establece que el número de decimales del flotante se conserve solo en n dígitos. Si va seguida de s (especificador de cadena, como %5.3s), establece que la cadena solo muestre los primeros n caracteres.
Ejemplo
string2 = "Tutorial"
number1 = 10
number2 = 20
-- Formateo básico de cadenas
print(string.format("Formato básico %s %s",string1,string2))
-- Formateo de fecha
date = 2; month = 1; year = 2014
print(string.format("Formato de fecha %02d/%02d/%04d", date, month, year))
-- Formateo decimal
print(string.format("%.4f",1/3))
El resultado de ejecutar el código anterior es:
基本格式化 Lua Tutorial 日期格式化 02/01/2014 0.3333
Otros ejemplos:
Ejemplo
string.format("%+d", 17.0) -- Salida +17
string.format("%05d", 17) -- Salida 00017
string.format("%o", 17) -- Salida 21
string.format("%u", 3.14) -- Salida 3
string.format("%x", 13) -- Salida d
string.format("%X", 13) -- Salida D
string.format("%e", 1000) -- Salida 1.000000e+03
string.format("%E", 1000) -- Salida 1.000000E+03
string.format("%6.3f", 13) -- Salida 13.000
string.format("%q", "One\nTwo") -- Salida "One\
-- Two"
string.format("%s", "monkey") -- Salida monkey
string.format("%10s", "monkey") -- Salida monkey
string.format("%5.3s", "monkey") -- Salida mon
Conversión entre caracteres y enteros
El siguiente ejemplo demuestra la conversión mutua entre caracteres y enteros:
Ejemplo
-- Convertir el primer carácter
print(string.byte("Lua"))
-- Convertir el tercer carácter
print(string.byte("Lua",3))
-- Convertir el primer carácter desde el final
print(string.byte("Lua",-1))
-- El segundo carácter
print(string.byte("Lua",2))
-- Convertir el segundo carácter desde el final
print(string.byte("Lua",-2))
-- Convertir el código ASCII entero a carácter
print(string.char(97))
El resultado de ejecutar el código anterior es:
76 97 97 117 117 a
Otras funciones comunes
El siguiente ejemplo demuestra otras operaciones con cadenas, como calcular la longitud de una cadena, concatenación de cadenas, copia de cadenas, etc.:
Ejemplo
string2 = "ejemplo"
string3 = ".com"
-- Usar .. para concatenar cadenas
print("Concatenación de cadenas",string1..string2..string3)
-- Longitud de la cadena
print("Longitud de la cadena ",string.len(string2))
-- Copiar la cadena 2 veces
repeatedString = string.rep(string2,2)
print(repeatedString)
El resultado de ejecutar el código anterior es:
连接字符串 www.example.com 字符串长度 6 ejemploejemplo
Patrones de coincidencia
Los patrones de coincidencia en Lua se describen directamente con cadenas normales. Se usan en las funciones de coincidencia de patrones.string.find, string.gmatch, string.gsub, string.match。
También puedes usar clases de caracteres en la cadena de patrón.
Una clase de caracteres es un elemento de patrón que puede coincidir con cualquier carácter de un conjunto específico. Por ejemplo, la clase de caracteres%dcoincide con cualquier dígito. Por lo tanto, puedes usar la cadena de patrón%d%d/%d%d/%d%d%d%dpara buscardd/mm/yyyyfechas con el formato:
Ejemplo
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date))) --> 30/05/1999
La siguiente tabla enumera todas las clases de caracteres soportadas por Lua:
Carácter individual (excepto^$()%.[]*+-?): coincide con el propio carácter.
- . (punto): coincide con cualquier carácter
- %a: coincide con cualquier letra
- %c: coincide con cualquier carácter de control (por ejemplo \n)
- %d: coincide con cualquier dígito
- %l: coincide con cualquier letra minúscula
- %p: coincide con cualquier signo de puntuación
- %s: coincide con cualquier carácter de espacio en blanco
- %u: coincide con cualquier letra mayúscula
- %w: coincide con cualquier letra/dígito
- %x: coincide con cualquier dígito hexadecimal
- %z: coincide con cualquier carácter que represente al 0
- %x (donde x es un carácter que no es letra ni dígito): coincide con el carácter x. Se usa principalmente para manejar la coincidencia de caracteres con función especial en la expresión (^$()%.[]*+-?), por ejemplo, %% coincide con %.
- [varias clases de caracteres]: coincide con cualquier clase de caracteres contenida en []. Por ejemplo, [%w_] coincide con cualquier letra/dígito, o con el guion bajo (_).
- [^varias clases de caracteres]: coincide con cualquier clase de caracteres no contenida en []. Por ejemplo, [^%s] coincide con cualquier carácter que no sea espacio en blanco.
Cuando las clases de caracteres anteriores se escriben en mayúsculas, indican que coinciden con cualquier carácter que no pertenezca a esa clase. Por ejemplo, %S coincide con cualquier carácter que no sea espacio en blanco. Por ejemplo, '%A' coincide con caracteres no alfabéticos:
> print(string.gsub("hello, up-down!", "%A", "."))
hello..up.down. 4
El número 4 no forma parte del resultado de la cadena; es el segundo resultado devuelto por gsub, que representa el número de reemplazos realizados.
En la coincidencia de patrones hay algunos caracteres especiales que tienen un significado especial. Los caracteres especiales en Lua son los siguientes:
( ) . % + - * ? [ ^ $
'%' se usa como carácter de escape para caracteres especiales, por lo que '%.' coincide con un punto; '%%' coincide con el carácter '%'. El carácter de escape '%' no solo se usa para escapar caracteres especiales, sino también para todos los caracteres no alfabéticos.
Los elementos de patrón pueden ser:
- Una clase de caracteres individual coincide con cualquier carácter único de esa clase;
- Una clase de caracteres individual seguida de un '
*', coincidirá con cero o más caracteres de esa clase. Este elemento siempre coincide con la cadena más larga posible; - Una clase de caracteres individual seguida de un '
+', coincidirá con uno o más caracteres de esa clase. Este elemento siempre coincide con la cadena más larga posible; - Una clase de caracteres individual seguida de un '
-', coincidirá con cero o más caracteres de esa clase. Y a diferencia de '*', este elemento siempre coincide con la cadena más corta posible; - Una clase de caracteres individual seguida de un '
?', coincidirá con cero o un carácter de esa clase. Si es posible, coincidirá con uno; -
%n, donde elnpuede ser de 1 a 9; este elemento coincide con una subcadena igual a lancaptura número (descrita más adelante). -
%bxy, dondexyyson dos caracteres distintos; este elemento coincide con cadenas quexcomienzan conyterminan con, y en las quexyyse mantienenequilibrados.xSolo+1Es decir, si se lee la cadena de izquierda a derecha, cada vez que se lee unySolo-1,yes el primero en llegar a 0y.%b()Por ejemplo, el elemento -
%f[set]puede coincidir con expresiones con paréntesis equilibrados., se refiere amodo fronteraset;setEste elemento coincide con unasetcadena vacía situada dentro de [conjunto], antes de un carácter,\0y el carácter anterior a esta posición no pertenece a
.
Conjuntotiene el significado descrito anteriormente.^Los puntos de inicio y fin de la cadena vacía coincidente se calculan como si en esa posición hubiera un carácter$' ' (un espacio).^Patrón:$Patrón
se refiere a una secuencia de elementos de patrón.
Anteponer el símbolo '' anclará la coincidencia al inicio de la cadena.Poner el símbolo ' al final del patrón' anclará la coincidencia al final de la cadena.Si '"(a*(.)%w(%s*))"' y '"a*(.)%w(%s*)"' aparecen en otras posiciones, no tienen ningún significado especial, solo se representan a sí mismos..Capturas:%s*Un patrón puede contener un subpatrón encerrado entre paréntesis;
Estos subpatrones se denominan()capturas"()aa()"."flaaap"Cuando la coincidencia tiene éxito, la subcadena de la cadena que es emparejada por la