La semana pasada había trabajado una funcionalidad, en la que debía validar si un string está en un idioma fuera del español y el inglés.
Todos estos años había aplicado una expresión regular como la siguiente:
[^A-Za-z0-9ÑñÁáÉéÍíÓóÚúÄäËëÏïÖöÜü\s\.\,\;\(\)\^\$\*\+\?\[\]\{\}\|\-]+
[^ ... ]+ significa que hará match contra toda palabra fuera de los rangos que coloque dentro de los corchetes.
Es decir considero lo que está en el abecedario, las tildes, dieresis, caracteres especiales; pero el Product Owner al revisar encuentra el posible caso de un nombre con &.
Lo primero que pensé fue en incluirlo a la expresión regular; pero esta vez traté de pensar 'out of the box' y finalmente aprendí una nueva solución:
[^\p{IsBasicLatin}\p{IsLatin-1Supplement}\p{IsLatinExtended-A}\p{IsLatinExtended-B}]+
\p{IsBasicLatin} es un bloque Unicode que tiene el rango del abecedario para este caso. Obviamente el resto de bloques que muestro son las extensiones que busco, los pueden ver a continuación:
La forma como estoy colocando los bloques es específico para dotnet, si deseas encontrar la solución para tu tecnología, te recomiendo ver las referencias.