javascript - ¿Podemos usar regex para resolver múltiples reglas a la vez?
Necesito prevenir cierta interacción de entrada del usuario y lo primero que me viene a la mente es regex de inmediato.
Primero escribiré lo mejor que pueda lo que necesito lograr y luego publicaré el código que escribí para lograr la mayoría de estas cosas, aunque todavía no sea perfecto...
- Toma la cuerda
- No permitas que empiece a escribir con un
espacio - No permita múltiples
espaciosde manera continua - No permita múltiples
puntosde manera continua - No permita múltiples
apóstrofos - Permitir los siguientes caracteres
[a-z] '. - No permita que la cadena supere los
14 caracteres
Ahora, aquí está mi código:
this.name = this.name
.replace(/^[\s]+/, '') // prevent starting with space
.replace(/\s\s+/, ' ') // prevent multiplace spaces
.replace(/\.\./, '.') // prevent multiple dots
.replace(/''/, '\'') // prevent multiple apostrophies
.replace(/[^ a-z'.]/i, '') // allowed
.toUpperCase() // transform
.substring(0, 14) // do not allow more than 14 characters
Preguntas:
¿Podemos y cómo, en caso afirmativo, cumplir todas o la mayoría de estas reglas de regex en un solo reemplazo?
¿Cómo puedo arreglar/mejorar mis reglas de regex para no permitir más de un solo
.? Lo hice para que no permita entradas continuas, pero un usuario puede usar dos puntos comoM.G.K, aunque quiero permitir solo una entrada de.en toda la cadena?¿Lo mismo que arriba, pero para
'(apóstrofe)?
Respuesta #1
El primer requisito para "meter" todo en una operación de reemplazo regex es bastante fácil de implementar, porque todos los reemplazos que necesitas hacer son usando los personajes que combinas. Puedes usar .replace(/^\s+|( \s)\s+|(\.)\.|(')'|[^a-z'.]+/ig, '$1$2$3'), mira esta demo regex.
Detalles
^\s+- inicio de la cadena (^) y luego 1 o más espacios en blanco|- o(\s)\s+- un solo espacio en blanco capturado en el Grupo 1 y luego 1 o más caracteres de espacio en blanco|- o(\.)\.- un.capturado en el Grupo 2, y luego un.|- o(')'- un'capturado en el Grupo 3 y luego un'|- o[^a-z'.]+- 1 o más caracteres que no sean un espacio, letra ASCII,'y..
El modificador /i hace que a-z coincida de manera insensible a mayúsculas y minúsculas, g permite coincidencias múltiples. El $1 se refiere al valor en el Grupo 1, $2 hace referencia al valor en el Grupo 2 y el $3 se refiere al valor del Grupo 3. Tenga en cuenta que si no se coinciden, estos valores en los grupos son cadenas vacías, por lo que podemos usarlos tres juntos en un solo patrón de reemplazo de cadena.
Los segundo y tercer requisitos requieren dos operaciones de reemplazo con expresiones regulares adicionales. El objetivo es coincidir y capturar todos los caracteres hasta la segunda aparición de ' y . y solo coincidir con la segunda aparición de ' y ., y luego reemplazar con la retroreferencia al primer grupo: 1) .replace(/^([^']*'[^']*)'/, '$1') (demo) y 2) .replace(/^([^.]*\.[^.]*)\./, '$1') (demo).
Detalles
^- ancla de inicio de cadena([^']*'[^']*)- Grupo 1:[^']*- cualquier cantidad de caracteres (0 o más) que no sean'(una[^...]es una clase de caracteres negada que coincide con cualquier carácter que no esté definido dentro de la clase)
'- una comilla simple[^']*- cualquier cantidad de 0 o más caracteres que no sean'
' - una comilla simple.Esta coincidencia se reemplaza con $1, el contenido del primer grupo de captura.
El tercer patrón es análogo al segundo patrón, solo que ' se reemplaza con ./\. (nota que dentro de una clase de caracteres, un . se trata como un . literal, no coincide con ningún carácter excepto los caracteres de salto de línea dentro de [...]).