El tipo de datos texto es una secuencia de caracteres, como letras, números y símbolos.Es el tipo de datos para almacenar la mayoría de la información basada en texto.
Declarar cadenas
Para declarar una variable de cadena, pon comillas alrededor de los caracteres.Es más común usar citas dobles ( " ), pero las citas únicas ( ' ) también funcionan.Si quieres incluir una cita simple o doble en tu cadena, envuelve tu cadena alrededor del otro tipo de cita o usa una cita escapada.
local string1 = "Hello world!"print(string1) --> ¡Hola mundo!local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
Para incluir tanto citas únicas como dobles en una cadena, o para crear cadenas de múltiples líneas, declarearlas usando paréntesis dobles:
local string1 = [[Helloworld!Hello "world"!Hello 'world'!]]print(string1)--> Hola--> ¡ mundo!--> ¡Hola, mundo!--> Hello 'world'!
Si es necesario, puedes anidar múltiples paréntesis dentro de una cadena usando el mismo número de signos iguales en ambos paréntesis de inicio y final:
local string1 = [=[Hello[[world!]]]=]print(string1)--> Hola--> [[world!]]
Combinar cadenas
Para combinar cadenas, concatenarlas con dos puntos ( .. ).La concatenación de cadenas no inserta un espacio entre ellas, por lo que tendrás que incluir espacio(s) al final/principio de una cadena anterior/siguiente o concatenar un espacio entre las dos cadenas.
local hello = "Hello"local helloWithSpace = "Hello "local world = "world!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> ¡Helloworld!print(string2) --> ¡Hola mundo!print(string3) --> Hello world!
Tenga en cuenta que el comando print() toma múltiples argumentos y los combina con espacios, por lo que puede usar , en lugar de .. para generar espacios en print() salidas.
local hello = "Hello"local world = "world"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> ¡Helloworld!print(hello, world .. exclamationMark) --> ¡Hola mundo!print(hello, world, exclamationMark) --> Hello world !
Convertir cadenas
Para convertir una cadena a un número, use la función tonumber() . Si la cadena no tiene una representación numérica, tonumber() devuelve nil .
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Hello123"print(tonumber(alphanumericString)) --> nil
Escapar cadenas
Para escapar una declaración de cadena doble o simple y embocar casi cualquier personaje, pon un guión trasero ( \ ) antes del personaje.Por ejemplo:
- Para incrustar una sola cita en una cadena de una sola cita, utilice \' .
- Para incrustar una cita doble en una cadena de citas dobles, utilice \" .
local string1 = 'Hello \'world\'!'print(string1) --> ¡Hola 'mundo'!local string2 = "Hello \"world\"!"print(string2) --> Hello "world"!
Ciertos personajes que siguen a los guiones de retroceso producen caracteres especiales en lugar de caracteres escapados:
- Para incrustar una nueva línea, utilice \n .
- Para incrustar una pestaña horizontal, use \t .
local string1 = "Hello\nworld!"print(string1)--> Hola--> ¡ mundo!local string2 = "Hello\tworld!"print(string2) --> Hello world!
interpolaciónde cadenas
Luau soporta interpolación de cadenas , una característica que te permite insertar expresiones en cadenas.Usa backticks ( ` ) para declarar una cadena interpolada, luego añade expresiones dentro de corchetes curly:
local world = "world"local string1 = `Hello {world}!`print(string1) --> Hello world!
Aunque las variables son el uso más común, puedes usar cualquier expresión, incluida la matemática:
local world = "world"local number = 1local letters = {"w", "o", "r", "l", "d"}local string1 = `Hello {world}, {number} time!`local string2 = `Hello {world}, {number + 1} times!`local string3 = `Hello {table.concat(letters)} a third time!`print(string1) --> ¡Hola mundo, 1 vez!print(string2) --> ¡Hola mundo, 2 veces!print(string3) --> Hello world a third time!
Se aplican las reglas de escape estándar para los guiones, los corchetes curly y las espadas de retroceso:
local string1 = `Hello \`\{world\}\`!`print(string1) --> Hello `{world}`!
Conversión de matemáticas
Si realizas operaciones matemáticas en una cadena, Luau convierte automáticamente la cadena a un número.Si la cadena no tiene una representación numérica, lanza un error.
print("55" + 10) --> 65print("55" - 10) --> 45print("55" * 10) --> 550print("55" / 10) --> 5.5print("55" % 10) --> 5print("Hello" + 10) --> print("Hello" + 10):1: attempt to perform arithmetic (add) on string and number
Comparaciones
Las cadenas se pueden comparar usando los operadores <, <=, > y >= que comparan usando el orden lexicográfico basado en los códigos ASCII de cada caracter en una cadena.Esto resultará en números en cadenas que no se comparan correctamente, por ejemplo, "100" será menos que "20" , ya que los bytes "0" y "1" tienen códigos ASCII más bajos que el byte "2" .
print("Apple" < "apple") --> ciertoprint("Banana" < "apple") --> verdadero (B está antes de un en ASCII)print("number100" < "number20") --> true
Referencia de patrón de cadena
Un patrón de cadena es una combinación de caracteres que puedes usar con string.match() , string.gmatch() y otras funciones para encontrar una pieza, o subtexto, de una cadena más larga
Partidos directos
Puedes usar coincidencias directas en una función Luau como string.match() , excepto para caracteres mágicos .Por ejemplo, estos comandos buscan la palabra Roblox dentro de una cadena:
local match1 = string.match("Welcome to Roblox!", "Roblox")local match2 = string.match("Welcome to my awesome game!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
Clases de personajes
Las clases de caracteres son esenciales para búsquedas de cuerdas más avanzadas.Puedes usarlos para buscar algo que no sea necesariamente específico de caracteres, pero que encaje dentro de una categoría conocida (clase), incluidas letras , dígitos , espacios , puntuación y más.
La siguiente tabla muestra las clases de personajes oficiales para los patrones de cuerda Luau:
Clase | Representa | Ejemplo de coincidencia |
---|---|---|
. | Cualquier personaje | 32kasGJ1%fTlk?@94 |
%a | Una letra mayúscula o minúscula | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
%l | Una letra minúscula | abcdefghijklmnopqrstuvwxyz |
%u | Una letra mayúscula | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
%d | Cualquier dígito (numbero) | 0123456789 |
%p | Cualquier caracter de puntuación | !@#;,. |
%w | Un carácter alfanumérico (ya sea una letra o un número) | abcdelfgihijklmnopqrsztuvwxyz0123456789 |
%s | Un espacio o un carácter de espacio en blanco | , \n , y \r |
%c | Un carácter de control especial | |
%x | Un carácter hexadecimal | 0123456789 ABCDEF |
%z | El carácter NULL ( \0 ) |
Para clases de caracteres de una letra como %a y %s, la letra mayúscula correspondiente representa lo "opuesto" de la clase.Por instancia, %p representa un carácter de puntuación mientras que %P representa todos los caracteres excepto la puntuación.
Personajes mágicos
Hay 12 "caracteres mágicos" que se reservan para fines especiales en los patrones:
$ | % | ^ | * | ( | ) |
. | [ | ] | + | - | ? |
Puedes escapar y buscar personajes mágicos usando el símbolo %.Por ejemplo, para buscar roblox.com , escapa el símbolo . (período) precediéndolo con un % como en %. .
-- la coincidencia "roblox.com" con "roblox#com" se interpreta como "cualquier carácter"local match1 = string.match("What is roblox#com?", "roblox.com")print(match1) --> roblox#com-- Escapa el período con % para que se interprete como un carácter de período literallocal match2 = string.match("I love roblox.com!", "roblox%.com")print(match2) --> roblox.com
Anclajes
Puedes buscar un patrón al comienzo o al final de una cadena usando los símbolos ^ y $.
local start1 = string.match("first second third", "^first") -- Coincide porque "primero" está al comienzoprint(start1) --> primerolocal start2 = string.match("third second first", "^first") -- No coincide porque "primero" no está al comienzoprint(start2) --> cerolocal end1 = string.match("first second third", "third$") -- Coincide porque "tercero" está al finalizarprint(end1) --> tercerolocal end2 = string.match("third second first", "third$") -- No coincide porque "tercero" no está al finalizarprint(end2) --> nil
También puedes usar tanto ^ como $ juntos para asegurarte de que un patrón coincida solo con la cadena completa y no solo con una parte de ella.
-- Usando tanto ^ como $ para coincidir en una cadena completalocal match1 = string.match("Roblox", "^Roblox$") -- Coincide porque "Roblox" es toda la cadena (igualdad)print(match1) --> Robloxlocal match2 = string.match("I play Roblox", "^Roblox$") -- No coincide porque "Roblox" no está al comienzo NI al finalizarprint(match2) --> cerolocal match3 = string.match("I play Roblox", "Roblox") -- Coincidencias porque "Roblox" se encuentra dentro de "Juego de Roblox"print(match3) --> Roblox
Modificadores de clase
Por sí solo, una clase de personaje solo coincide con un caracter en una cadena.Por instancia, el siguiente patrón ( "%d" ) comienza a leer la cadena de izquierda a derecha, encuentra la primera digit ( 2 ), y se detiene.
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match) --> 2
Puedes usar modificadores con cualquier clase de personaje para controlar el resultado:
Cuantificador | Significado |
---|---|
+ | Coincide con 1 o más de la clase de personaje anterior |
- | Coincide con el menor número posible de la clase de personaje anterior |
* | Coincide con 0 o más de la clase de caracteres anterior |
? | Coincide con 1 o menos de la clase de caracteres anterior |
%n | Para n entre 1 y 9, coincide con una subcadena igual a la n cadena capturada. |
%bxy | La captura equilibrada que coincide con x , y , y todo lo que está entre (por ejemplo, %b() coincide con una pareja de paréntesis y todo lo que está entre ellos) |
Añadir un modificador al mismo patrón ( "%d+" en lugar de "%d" ), produce 25 en lugar de 2 :
local match1 = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match1) --> 2local match2 = string.match("The Cloud Kingdom has 25 power gems", "%d+")print(match2) --> 25
Conjuntos de clases
Conjuntos debe usarse cuando una sola clase de caracteres no puede hacer todo el trabajo.Por instancia, quizás desees coincidir con ambas letras minúsculas (%l), y caracteres de puntuación (%p), usando un solo patrón.
Los conjuntos se definen por paréntesis [] alrededor de ellos.En el siguiente ejemplo, observe la diferencia entre usar un conjunto ( "[%l%p]+" ) y no usar un conjunto ( "%l%p+" ).
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- Establecerprint(match1) --> ¡¡¡ello!!!local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- No establecidoprint(match2) --> o!!!
El primer comando (establecer) le dice a Luau que busque tanto caracteres minúsculos como puntuación.Con el cuantificador + agregado después de todo el establecer, encuentra todos de esos personajes ( ello!!! ), deteniéndose cuando llega al espacio.
En el segundo comando (no establecido), el cuantificador + sólo se aplica a la clase %p antes de ella, por lo que Luau agarra sólo la primera letra minúscula ( o ) antes de la serie de puntuación ( !!! ).
Al igual que las Clasesde personajes, los conjuntos pueden ser "opuestos" entre sí.Esto se hace agregando un carácter ^ en el comienzo del establecer, directamente después de la apertura [.Por instancia, "[%p%s]+" representa tanto la puntuación como los espacios, mientras que "[^%p%s]+" representa todos los caracteres excepto la puntuación y los espacios.
Los conjuntos también admiten rangos que te permiten encontrar una gama completa de coincidencias entre un personaje inicial y final .Esta es una característica avanzada que se describe con más detalle en el Manual de Lua 5.1.
Capturas de cuerda
Las cadenas capturas son sub patrones dentro de un patrón.Estas están encerradas en paréntesis () y se usan para obtener (capturar) subcadenas coincidentes y guardarlas en variables.Por ejemplo, el siguiente patrón contiene dos capturas, (%a+) y (%d+) , que devuelven dos subcadenas al realizar una coincidirexitosa.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("TwentyOne = 21", pattern)print(key1, val1) --> Veintiuno 21local key2, val2 = string.match("TwoThousand= 2000", pattern)print(key2, val2) --> Dos Mil 2000local key3, val3 = string.match("OneMillion=1000000", pattern)print(key3, val3) --> OneMillion 1000000
En el patrón anterior, el cuantificador ? que sigue a ambas clases %s es una adición segura porque hace que el espacio al lado del signo = sea opcional.Eso significa que la coincidencia tiene éxito si falta uno (o ambos) espacios alrededor del signo igual.
Las capturas de cuerdas también pueden ser anidadas como el siguiente ejemplo:
local places = "The Cloud Kingdom is heavenly, The Forest Kingdom is peaceful"local pattern = "(The%s(%a+%sKingdom)[%w%s]+)"for description, kingdom in string.gmatch(places, pattern) doprint(description)print(kingdom)end--> El Reino de la Nube es celestial--> Reino de la nube--> El Reino del Bosque es pacífico--> Forest Kingdom
Esta búsqueda de patrón funciona de la siguiente manera:
El iterador string.gmatch() busca una coincidencia en todo el patrón "descripción" definido por el par exterior de paréntesis.Esto se detiene en el primer coma y captura lo siguiendo:
# | Patrón | Capturar |
---|---|---|
1 | (The%s(%a+%sKingdom)[%w%s]+) | El Reino de la Nube es celestial |
Usando su primera capturarexitosa, el recorrido luego busca una coincidencia en el patrón "reino" definido por el par interno de paréntesis.Este patrón anidado simplemente captura lo siguiendo:
# | Patrón | Capturar |
---|---|---|
2 | (%a+%sReino) | Reino de la nube |
El iterador luego se retira y continúa buscando la cadena completa, capturando lo siguiendo:
# | Patrón | Capturar |
---|---|---|
3 | (The%s(%a+%sKingdom)[%w%s]+) | El reino del bosque es pacífico |
4 | (%a+%sReino) | Reino del bosque |
Además de todo lo anterior, hay un caso especial con una captura vacía ( () ).Si una captura está vacía, entonces la posición en la cadena se capturará:
local match1 = "Where does the capture happen? Who knows!"local match2 = "This string is longer than the first one. Where does the capture happen? Who knows?!"local pattern = "()Where does the capture happen%? Who knows!()"local start1, finish1 = string.match(match1, pattern)print(start1, finish1) --> 1 42local start2, finish2 = string.match(match2, pattern)print(start2, finish2) --> 43 84
Estas capturas especiales pueden anidarse como las normales:
local places = "The Cloud Kingdom is heavenly, The Forest Kingdom is peaceful."local pattern = "The (%a+()) Kingdom is %a+"for kingdom, position in string.gmatch(places, pattern) doprint(kingdom, position)end--> Nube 10--> Forest 42
Los valores devueltos son inusuales en que son números en lugar de cadenas:
local match = "This is an example"local pattern = "This is an ()example"local position = string.match(match, pattern)print(typeof(position)) --> number