Búsqueda y extracción de substrings
Aplique string.find y string.sub para localizar y extraer texto.
Búsqueda y extracción de substrings es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.
Conceptos básicos de string.find
string.find(s, pattern, init, plain) busca un patrón en s a partir de init (por defecto, 1). Devuelve las posiciones inicial y final de la coincidencia, o nil si no la encuentra. Con plain=true, trata el patrón como una cadena literal (sin caracteres mágicos).
local s = "hello world"
local i, j = string.find(s, "world")
print(i, j) -- 7 11
-- Plain search (literal string)
local i2, j2 = string.find("a+b=5", "+", 1, true)
print(i2, j2) -- 2 2
-- Not found
print(string.find(s, "xyz")) -- nilstring.sub para extraer subcadenas
string.sub(s, i, j) extrae la subcadena desde la posición i hasta la j (ambas inclusive). Los índices negativos cuentan desde el final: -1 es el último carácter. Si se omite j, se toma por defecto el final de la cadena.
local s = "hello world"
print(string.sub(s, 1, 5)) -- hello
print(string.sub(s, 7)) -- world
print(string.sub(s, -5)) -- world
print(string.sub(s, 1, -7)) -- hello
print(s:sub(7, 11)) -- world (method syntax)Combinar find y sub
Combine string.find y string.sub para localizar y extraer subcadenas. Primero busque el delimitador y después extraiga las partes que lo rodean. Este es el enfoque básico para dividir cadenas.
local s = "key=value"
local i = string.find(s, "=")
if i then
local key = string.sub(s, 1, i - 1)
local val = string.sub(s, i + 1)
print(key, val) -- key value
endstring.match para capturar patrones
string.match(s, pattern, init) devuelve las subcadenas capturadas que coinciden con el patrón. Si el patrón no tiene capturas, devuelve la coincidencia completa. Si no coincide nada, devuelve nil. Las capturas se definen mediante paréntesis en el patrón.
local date = "2024-03-15"
local y, m, d = string.match(date, "(%d+)-(%d+)-(%d+)")
print(y, m, d) -- 2024 03 15
-- No capture: returns the whole match
local num = string.match("price: 42.5 USD", "%d+%.%d+")
print(num) -- 42.5Buscar la última aparición
Para encontrar la última aparición de una subcadena, realice una búsqueda en un bucle avanzando la posición inicial, o busque desde el final. El enfoque habitual consiste en llamar repetidamente a string.find con la posición situada justo después de la coincidencia anterior, hasta que devuelva nil.
local function findLast(s, sub)
local last_i, last_j
local i, j = string.find(s, sub, 1, true)
while i do
last_i, last_j = i, j
i, j = string.find(s, sub, j + 1, true)
end
return last_i, last_j
end
local i, j = findLast("a/b/c/d", "/")
print(i, j) -- 6 6Extraer extensiones de archivo
Un uso práctico de string.match es extraer la extensión de un nombre de archivo. El patrón "([^%.]+)$" captura la última secuencia de caracteres que no sean puntos al final de la cadena, o bien "%.([^%.]+)$" para capturar únicamente lo que aparece después del último punto.
local function getExt(filename)
return string.match(filename, "%.([^%.]+)$")
end
print(getExt("photo.jpg")) -- jpg
print(getExt("archive.tar.gz")) -- gz
print(getExt("README")) -- nil
print(getExt("config.lua.bak")) -- bakDividir cadenas
Lua no tiene una función integrada para dividir cadenas, pero puede implementarla con string.gmatch. Itere sobre todas las secuencias que no sean delimitadores o utilice un patrón que capture el contenido entre delimitadores.
local function split(s, sep)
local result = {}
local pattern = "([^" .. sep .. "]+)"
for part in string.gmatch(s, pattern) do
result[#result+1] = part
end
return result
end
local parts = split("one,two,three,four", ",")
for i, p in ipairs(parts) do
print(i, p)
end
-- 1 one 2 two 3 three 4 fourEliminar espacios en blanco
Elimine los espacios en blanco iniciales y finales haciendo coincidirlos y descartándolos. El patrón "^%s*(.-)%s*$" utiliza el cuantificador perezoso .- para capturar el contenido mínimo entre los espacios iniciales y finales opcionales.
local function trim(s)
return string.match(s, "^%s*(.-)%s*$")
end
print("|" .. trim(" hello ") .. "|") -- |hello|
print("|" .. trim(" \t\n") .. "|") -- ||
print("|" .. trim("no spaces") .. "|") -- |no spaces|Extraer números del texto
Utilice string.gmatch con un patrón de números para extraer todos los números de una cadena. El patrón %-?%d+%.?%d* coincide con un signo negativo opcional, dígitos, un punto decimal opcional y más dígitos.
local text = "Revenue: $1,234.56 Expenses: $567.89 Net: $666.67"
local numbers = {}
for n in string.gmatch(text, "%d+%.?%d*") do
numbers[#numbers+1] = tonumber(n)
end
for _, v in ipairs(numbers) do
io.write(v .. " ")
end
print() -- 1 234.0 56.0 567.89 666.67Normalización de posiciones en cadenas
Los índices negativos de Lua permiten trabajar desde el final de una cadena. string.sub(s, -n) obtiene los últimos n caracteres. Combínelo con #s para calcular posiciones. Comprender la relación entre los índices positivos y negativos ayuda a evitar errores de desplazamiento de una posición.
local s = "abcdefgh"
-- Last 3 characters
print(s:sub(-3)) -- fgh
-- All but last 2
print(s:sub(1, -3)) -- abcdef
-- Character at position from end
print(s:sub(-1, -1)) -- h
print(s:sub(-4, -2)) -- efgComprobación rápida
¿Qué devuelve string.sub("hello", 2, -2)?
Repaso: búsqueda y extracción
Resumen:
string.find(s, pat, init, plain)— devuelve inicio, fin o nilstring.sub(s, i, j)— extrae por posición; los índices negativos cuentan desde el finalstring.match(s, pat)— devuelve las capturas o la coincidencia completa- Use
plain=truepara buscar literalmente (sin caracteres mágicos) - Implemente la división con
string.gmatch - Para eliminar espacios: patrón
"^%s*(.-)%s*$"
Preguntas frecuentes
¿La lección «Búsqueda y extracción de substrings» es gratis?
Sí — el texto completo de «Búsqueda y extracción de substrings» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Búsqueda y extracción de substrings»?
Aplique string.find y string.sub para localizar y extraer texto. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Lua Academy?
No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Búsqueda y extracción de substrings»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Lua Academy?
Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Conceptos básicos de strings: concatenación y longitud
- Búsqueda y extracción de substrings
- string.format para la salida
- string.gsub y string.gmatch