Tengo un área de texto con un FormControl simple, que me gustaría validar a través del método Validators.pattern(). Ninguna de las nuevas líneas debe comenzar con un ? o *. Esos son todos los requisitos.
He intentado lo siguiente:
control = new FormControl('', Validators.pattern(/^(\?|\*)$/));Con esto, puedo validar la primera línea (funciona bien si la línea comienza con un carácter especial), pero tan pronto como presione enter, mi FormControl no será válido.
¿Cómo debo modificar la expresión regular para cumplir con los requisitos?
Dado que se trata de un área de texto, debe emular el metaescape \A que es "inicio de cadena , no línea"
/(?<!\s)^(?![\s\S]*^[?*])/gm(?<!\s)^ - detecta el inicio de la cadena(?![\s\S]*^[?*]) - Delante de mí no puede haber ninguna línea que comience con un signo de interrogación o un asterisco[\s\S]* - captura todo, incluso las líneas nuevas^[?*] : detecta una línea que comienza con un signo de interrogación o un asteriscoPuedes usar
// With a string literal where anchors are added automatically by Angular control = new FormControl('', Validators.pattern('(?![?*]).*(?:[\r\n]+(?![?*]).*)*')); // Or, with a regex literal control = new FormControl('', Validators.pattern(/^(?![?*]).*(?:[\r\n]+(?![?*]).*)*$/));Vea la demostración de expresiones regulares . Detalles :
^ - anclaje de inicio de cadena(?![?*]) - no ? y * se permiten inmediatamente a la derecha de la ubicación actual.* - cero o más caracteres que no sean caracteres de salto de línea tantos como sea posible(?: - comienzo de un grupo que no captura:[\r\n]+ - uno o más caracteres CR / LF (retorno de carro o caracteres de avance de línea)(?![?*]).* - una línea que no comienza con ? ni *)* - fin de grupo, cero o más ocurrencias$ - final de la cadena.