Estoy tratando de validar direcciones de correo electrónico utilizando un patrón de expresión de búsqueda hacia atrás con el negativo. Más concretamente, sólo se permitirá a aquellos que no terminan en una secuencia específica @mydomain.de
.
Esto funciona bien en la mayoría de mis cadenas de prueba. Sin embargo, la adición de una nueva línea al final de la cadena ( \r\n
) parece romperlo, como lo hace partido dura no.
Soy consciente de que esto normalmente se podría resolver más fácilmente utilizando .endsWith()
. Estoy intentando utilizar la expresión regular en un modelo de la anotación javax.
Pattern p = Pattern.compile("^.*(?<!@mydomain\\.de)$")
p.matcher("[email protected]").matches() // => true
p.matcher("[email protected]\r\n").matches() // => false
Yo esperaría que ambas cadenas para que coincida con lo que no terminen en la secuencia prohibida @mydomain.de
Por defecto, el punto ( .
) comodín no coincide con caracteres de terminador de línea.
Esto significa que ^.*$
no coincide con la segunda cadena.
Puede hacer que coincida con todos los caracteres especificando el DOTALL
modo de:
Pattern p = Pattern.compile("^.*(?<!@mydomain\\.de)$", Pattern.DOTALL)
O:
Pattern p = Pattern.compile("(?s)^.*(?<!@mydomain\\.de)$")
public static final int DOTALL
Permite dotall modo.
En el modo dotall, la expresión
.
coincide con cualquier carácter, incluyendo un final de línea. Por defecto, esta expresión no coincide con las terminaciones de línea.Dotall modo también se puede activar a través de la expresión de la bandera incrustada
(?s)
. (El s es un mnemónico para el modo "de una sola línea", que es lo que se llama en Perl.)