una todos remover regular reemplazar quitar los expresion escape caracteres cadena acentos javascript regex unicode

todos - Regex de JavaScript concreto para caracteres acentuados(signos diacríticos)



reemplazar todos los caracteres de una cadena javascript (6)

He buscado en Stack Overflow ( reemplazando caracteres ... eh , cómo JavaScript no sigue el estándar Unicode con respecto a 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 (last [comma space] first) , y quiero brindar soporte para signos diacríticos, pero evidentemente en JavaScript es un poco más difícil que en otros idiomas / plataformas.

Esta fue mi versión original, hasta que quise 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:

Listando explícitamente todos los caracteres acentuados que quisiera aceptar como válidos (cojo y excesivamente complicado):

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 con un apellido / nombre con cualquiera de los caracteres acentuados admitidos en caracteres accentedCharacters .

Mi otro enfoque fue usar el . clase de personaje, para tener una expresión más simple:

var regex = /^.+,/s.+$/;

  • Esto coincidiría con casi cualquier cosa, al menos en forma de: something, something . 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 gama de caracteres Unicode, probados y en funcionamiento, aunque no intenté con nada loco, solo con lo que normalmente veo en nuestro departamento de idiomas para los nombres de los miembros de la facultad.

Aquí están mis preocupaciones:

  1. La primera solución es demasiado limitante, y descuidada y complicada en eso. Tendría que cambiarse si olvidé un personaje o dos, y eso no es muy práctico.
  2. La segunda solución es mejor, conciso, pero probablemente coincide 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 ).
  3. La tercera solución parece ser la más precisa, pero ¿hay algún truco? No estoy muy familiarizado con Unicode, al menos en la práctica, pero mirando una tabla de códigos / continuación de esa tabla , /u00C0-/u017F parece ser bastante sólida, al menos para mi entrada esperada.

    • El profesorado no enviará formularios con sus nombres en su lengua materna (por ejemplo, árabe, chino, japonés, etc.), así que no tengo que preocuparme por los caracteres fuera del alfabeto latino.

Entonces, la verdadera pregunta (s) : ¿Cuál de estos tres enfoques es el más adecuado para la tarea? ¿O hay mejores soluciones?


¿Cuál de estos tres enfoques es el más adecuado para la tarea?

Depende de la tarea :-) Para hacer coincidir exactamente todos los caracteres latinos y sus versiones acentuadas, las gamas Unicode probablemente proporcionan la mejor solución. Se pueden extender a todos los caracteres que no sean de espacio en blanco, lo que podría hacerse utilizando la clase de caracteres /S

Estoy forzando un campo en una interfaz de usuario para que coincida con el formato: last_name, first_name (last [comma space] first)

El problema más básico que estoy viendo aquí no son diacríticos, sino espacios en blanco. Hay algunos nombres que consisten en varias palabras, por ejemplo, para títulos. Así que deberías ir con el más genérico, que es permitir todo menos la coma que distingue primero del apellido:

/[^,]+,/s[^,]+/

Pero tu segunda solución con el . la clase de personaje es igual de buena, entonces solo necesitarás preocuparte por comas múltiples entonces.


¿Qué tal esto?

/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/


El rango latino acentuado /u00C0-/u017F no era suficiente para mi base de datos de nombres, así que extendí la expresión regular a [a-zA-Z/u00C0-/u024F] .

Si necesita más puntos de código, puede encontrar más rangos en la Lista de caracteres Unicode de Wikipedia.

La expresión regular original que se detiene en /u017F corrige el nombre "Şenol". De acuerdo con el Analizador Unicode de FontSpace , ese primer carácter es /u0218 , LETRA MAYÚSCULA LATINA S CON COMA ABAJO. (Sí, generalmente se escribe con un cedilla-S /u015E , "Şenol". Pero de ninguna manera voy a ir a decirle, "¡Estás deletreando mal tu nombre!")


La biblioteca XRegExp tiene un complemento llamado Unicode que ayuda a resolver tareas como esta.

<script src="xregexp.js"></script> <script src="addons/unicode/unicode-base.js"></script> <script> var unicodeWord = XRegExp("^//p{L}+$"); unicodeWord.test("Русский"); // true unicodeWord.test("日本語"); // true unicodeWord.test("العربية"); // true </script>

Se menciona en los comentarios a la pregunta, pero es fácil pasar por alto. Lo he notado solo después de enviar esta respuesta.


La manera más fácil de aceptar todos los acentos es esta:

[A-zÀ-ú] // accepts lowercase and uppercase characters [A-zÀ-ÿ] // as above but including letters with an umlaut (includes [ ] ^ /) [A-Za-zÀ-ÿ] // as above but not including [ ] ^ /