0Pricing
Lua Academy · Lección

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"))  -- nil

string.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
end

string.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.5

Buscar 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  6

Extraer 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"))   -- bak

Dividir 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 four

Eliminar 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.67

Normalizació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)) -- efg

Comprobació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 nil
  • string.sub(s, i, j) — extrae por posición; los índices negativos cuentan desde el final
  • string.match(s, pat) — devuelve las capturas o la coincidencia completa
  • Use plain=true para 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

  1. Conceptos básicos de strings: concatenación y longitud
  2. Búsqueda y extracción de substrings
  3. string.format para la salida
  4. string.gsub y string.gmatch
← Volver a Lua Academy