17 / Entrada, salida y datos

Expresiones Regulares

El módulo std/regex envuelve expresiones regulares extendidas POSIX. Tres funciones cubren las operaciones más comunes: probar si un patrón coincide, extraer la primera coincidencia y reemplazar coincidencias en una cadena. Los patrones siguen la sintaxis estándar POSIX ERE.

17-regex.nxFuente →
// Expresiones regulares: regex_is_match, regex_match, regex_replace

import "std/regex"

// bool -> texto: int_to_string() espera un int y un bool no se convierte solo,
// así que la conversión se escribe explícita.
fn si_no(b: bool) -> String {
    if b { return "si" }
    return "no"
}

fn validar_email(email: String) -> bool {
    // Patrón POSIX básico para email
    return regex_is_match(email, "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9.-]+$")
}

fn main() -> int {
    // Validar emails
    let email1: String = "alice@example.com"
    let email2: String = "no-es-email"
    let email3: String = "bob.dev@nyx-lang.org"

    print("Email: " + email1 + " -> " + si_no(validar_email(email1)))
    print("Email: " + email2 + " -> " + si_no(validar_email(email2)))
    print("Email: " + email3 + " -> " + si_no(validar_email(email3)))

    // regex_match: retorna la primera coincidencia o ""
    let texto: String = "Nyx version 0.12.0 released"
    let resultado: String = regex_match(texto, "[0-9]+\\.[0-9]+\\.[0-9]+")
    print("Version encontrada: " + resultado)

    // regex_replace: reemplaza primera coincidencia
    let frase: String = "Hola   mundo   Nyx"
    let limpio: String = regex_replace(frase, "  +", " ")
    print("Sin espacios dobles: " + limpio)

    // regex_replace_all: reemplaza todas las coincidencias
    let html: String = "<b>nyx</b> es <i>rapido</i>"
    let sin_tags: String = regex_replace_all(html, "<[^>]+>", "")
    print("Sin HTML: " + sin_tags)

    return 0
}
Salidastdout
Email: alice@example.com -> si
Email: no-es-email -> no
Email: bob.dev@nyx-lang.org -> si
Version encontrada: 0.12.0
Sin espacios dobles: Hola mundo   Nyx
Sin HTML: nyx es rapido

Cómo funciona

regex_is_match(str, pattern) devuelve un bool que indica si el patrón coincide en algún punto de la cadena; un bool no entra en int_to_string, así que la receta lo imprime con el helper si_no. Anclar con ^ y $ obliga a que la coincidencia sea sobre la cadena completa, algo esencial para validar entradas como en el ejemplo del email. Ojo con las clases de caracteres: un - literal entre corchetes va primero o último, si no POSIX lo lee como rango y la clase entera deja de coincidir.

regex_match(str, pattern) devuelve la primera subcadena que coincide con el patrón, o una cadena vacía si no hay coincidencia. Es útil para tareas de extracción, como parsear números de versión, fechas o identificadores dentro de un texto más grande.

regex_replace sustituye SOLO la primera coincidencia — por eso la salida conserva el triple espacio antes de Nyx — mientras que regex_replace_all reemplaza todas las coincidencias no solapadas. El ejemplo que elimina etiquetas HTML usa el patrón <[^>]+> para hacer coincidir cualquier etiqueta HTML completa y la reemplaza por una cadena vacía, dejando solo el contenido de texto.