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.
Código
// Expresiones regulares: regex_is_match, regex_match, regex_replace
import "std/regex"
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 + " -> " + int_to_string(validar_email(email1)))
print("Email: " + email2 + " -> " + int_to_string(validar_email(email2)))
print("Email: " + email3 + " -> " + int_to_string(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 = "nyx es rapido"
let sin_tags: String = regex_replace_all(html, "<[^>]+>", "")
print("Sin HTML: " + sin_tags)
return 0
}
Salida
Email: alice@example.com -> 1 Email: no-es-email -> 0 Email: bob.dev@nyx-lang.org -> 1 Version encontrada: 0.12.0 Sin espacios dobles: Hola mundo Nyx Sin HTML: nyx es rapido
Explicación
regex_is_match(str, pattern) devuelve un bool (representado como 1/0 al imprimirse vía int_to_string) que indica si el patrón coincide en algún punto de la cadena. Anclar con ^ y $ obliga a que la coincidencia sea sobre la cadena completa, algo esencial para validar entradas como en el ejemplo del email.
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 la primera coincidencia por una cadena de reemplazo, 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.
Source: examples/by-example/17-regex.nx