He buscado en Stack Overflow ( reemplazando caracteres ... eh , cómo JavaScript no sigue el estándar Unicode sobre RegExp , etc.) y realmente no he encontrado una respuesta concreta a la pregunta:
How can JavaScript match for accented characters (those with diacritical marks)?
Estoy forzando un campo en una interfaz de usuario para que coincida con el formato: last_name, first_name
(último [espacio de coma] primero) , y quiero proporcionar soporte para diacríticos, pero evidentemente en JavaScript es un poco más difícil que otros idiomas / plataformas.
Esta era mi versión original, hasta que quería agregar soporte diacrítico:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
Actualmente estoy debatiendo uno de los tres métodos para agregar soporte, todos los cuales he probado y trabajo (al menos hasta cierto punto, realmente no sé cuál es el "alcance" del segundo enfoque). Aquí están:
Enumerar explícitamente todos los caracteres acentuados que me gustaría aceptar como válidos (cojos y demasiado complicados):
var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
- Esto coincide correctamente un apellido / nombre con cualquiera de los caracteres acentuados admitidos en
accentedCharacters
.
Mi otro enfoque era usar la .
clase de caracteres, para tener una expresión más simple:
var regex = /^.+,\s.+$/;
- Esto coincidiría para casi cualquier cosa, por lo menos en la forma de:
something, something
. Eso está bien, supongo ...
El último enfoque, que acabo de encontrar, podría ser más simple ...
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
- Coincide con una variedad de caracteres Unicode, probados y funcionando, aunque no intenté nada loco, solo las cosas normales que veo en nuestro departamento de idiomas para los nombres de los miembros de la facultad.
Aquí están mis preocupaciones:
- La primera solución es demasiado limitante y descuidada y complicada. Tendría que cambiarlo si olvido un personaje o dos, y eso no es muy práctico.
- La segunda solución es mejor, concisa, pero probablemente coincida mucho más de lo que debería. No pude encontrar ninguna documentación real sobre exactamente qué
.
coincide, solo la generalización de "cualquier carácter excepto el carácter de nueva línea" (de una tabla en el MDN ). La tercera solución parece ser la más precisa, pero ¿hay alguna trampa? No estoy muy familiarizado con Unicode, al menos en la práctica, pero mirar una tabla de códigos / continuación de esa tabla ,
\u00C0-\u017F
parece ser bastante sólido, al menos para mi entrada esperada.- La facultad no enviará formularios con sus nombres en su idioma nativo (por ejemplo, árabe, chino, japonés, etc.), por lo que no tengo que preocuparme por los caracteres fuera del latín.
Entonces, la (s) verdadera (s) pregunta (s) : ¿Cuál de estos tres enfoques es el más adecuado para la tarea? ¿O hay mejores soluciones?
.
átomo coincide con cualquier cosa excepto las líneas nuevas " en realidad es bastante exacto :-)
regex = /^[^,]+,\s[^,]+$/;
para evitar eso.