es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo escapar una expresión regular dinámica en Swift?

Entonces, estoy obteniendo una cadena hexadecimal como esta de la API 2f5e28285b5e3c3e28295b5c5d5c5c2e2c3b3a5c7340225d2b285c2e5b5e3c3e28295b5c5d5c5c2e2c3b3a5c7340225d2b292a297c28222e2b2229294028285c5b5b302d395d7b312c337d5c2e5b302d395d7b312c337d5c2e5b302d395d7b312c337d5c2e5b302d395d7b312c337d5d297c28285b612d7a412d5a5c2d302d395d2b5c2e292b5b612d7a412d5a5d7b322c7d2929242f

Una vez decodificado a una cadena utf, este es el regex que se forma:

/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

Este es un regex de correo electrónico válido según algunos validadores de regex en línea. Ahora surge el problema de cómo escapar esta cadena. He probado el siguiente código:

if let data = emailRegex.hexadecimal, let string = String(data: data, encoding: .utf8) {
                guard NSPredicate(format: "SELF MATCHES %@", NSRegularExpression.escapedPattern(for: string))
                    .evaluate(with: email) else {
                        throw ValidationError.invalidInput
                }

                isValid = true
            }
            else {
                throw ValidationError.missingInput
            }

Esto resulta en el siguiente regex escapado:

\\/\\^\\(\\(\\[\\^<>\\(\\)\\[\\\\]\\\\\\\\\\.,;:\\\\s@\"]\\+\\(\\\\\\.\\[\\^<>\\(\\)\\[\\\\]\\\\\\\\\\.,;:\\\\s@\"]\\+\\)\\*\\)\\|\\(\"\\.\\+\"\\)\\)@\\(\\(\\\\\\[\\[0-9]\\{1,3\\}\\\\\\.\\[0-9]\\{1,3\\}\\\\\\.\\[0-9]\\{1,3\\}\\\\\\.\\[0-9]\\{1,3\\}]\\)\\|\\(\\(\\[a-zA-Z\\\\-0-9]\\+\\\\\\.\\)\\+\\[a-zA-Z]\\{2,\\}\\)\\)\\$\\/

El regex escapado anterior da resultados incorrectos para correos electrónicos válidos, muestra errores de validación incluso para los correctos. ¡Se agradecerá cualquier ayuda!

Editar 1:
Código actualizado a

let string = String(String(data: data, encoding: .utf8)!.dropFirst().dropLast())

Pero el compilador se bloquea en el siguiente –
enter image description here

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la decodificación inicial de la cadena hexadecimal a una cadena UTF. La cadena resultante parece tener un conjunto adicional de caracteres al principio y al final que causan problemas al intentar escapar el patrón regex.

    Una solución podría ser eliminar estos caracteres adicionales antes de intentar escapar el patrón. Esto se puede hacer utilizando las funciones de cadena dropFirst() y dropLast().

    Aquí está una versión actualizada del código:

    if let data = emailRegex.hexadecimal, let string = String(data: data, encoding: .utf8) {
        let pattern = String(string.dropFirst().dropLast()) // eliminar caracteres adicionales
        guard NSPredicate(format: "SELF MATCHES %@", NSRegularExpression.escapedPattern(for: pattern))
            .evaluate(with: email) else {
                throw ValidationError.invalidInput
        }
        isValid = true
    } else {
        throw ValidationError.missingInput
    }
    

    Esto debería resultar en un patrón regex correctamente escapado que se puede utilizar para la validación de correo electrónico.

Comments are closed.