¿Cuál es la forma más fácil de hacer coincidir caracteres no ASCII en una expresión regular? Me gustaría hacer coincidir todas las palabras individualmente en una cadena de entrada, pero el idioma puede no ser el inglés, por lo que tendré que hacer coincidir cosas como ü, ö, ß y ñ. Además, esto está en Javascript / jQuery, por lo que cualquier solución deberá aplicarse a eso.
javascript
jquery
regex
Paul Wicks
fuente
fuente
all words
suena como si solo quisieras letras que no están en inglés y no todos los caracteres que no están en inglés como dice el título de tu pregunta.Respuestas:
Esto debería hacerlo:
Coincide con cualquier carácter que no esté contenido en el conjunto de caracteres ASCII (0-127, es decir, 0x0 a 0x7F).
Puedes hacer lo mismo con Unicode:
Para Unicode puedes ver estos 2 recursos:
fuente
[\u00BF-\u1FFF\u2C00-\uD7FF\w]
como una carta.[\u00C0-\u1FFF\u2C00-\uD7FF\w]
(sin signo de interrogación invertido¿
), en cuanto a los rangos, consulte BMP .00C0
estáÀ
en el Suplemento latino-1 ,1FFF
es el último carácter del griego extendido,2C00
es la primera letra en glagolítico yD7FF
es el último carácter en Hangul Jamo Extended-B. Así que es todo excepto: símbolos y caracteres especiales en 2 primeros bloques; símbolos en bloques intermedios; sustitutos, área privada y caracteres especiales en bloques finales.Esta expresión regular coincidirá con todas las palabras en el texto de cualquier idioma ...
fuente
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
La situación con expresiones regulares, Unicode y Javascript apesta. Es ridículo que los programadores tengan que depender de bibliotecas externas para reconocer que "Αλφα" es una palabra, o incluso que "é" es una letra.
Pero así sigue.
Este tipo ha escrito una buena biblioteca para manejar Unicode en Javascript Regexes:
http://blog.stevenlevithan.com/archives/javascript-regex-and-unicode
El material Unicode es un complemento para esta biblioteca de expresiones regulares:
http://xregexp.com/
Aquí hay una publicación sobre la extensión Unicode:
http://blog.stevenlevithan.com/archives/xregexp-unicode-plugin
Y la página de extensión en sí:
http://xregexp.com/plugins/
Gran trabajo pero todavía me fastidia que Javascript sea tan al revés en este sentido.
(Escribió un libro para O'Reilly sobre el tema, por lo que es muy posible que sepa de qué está hablando).
La forma en que lo implementó es agregando tablas de caracteres con ciertas propiedades. Luego, cuando construyes una expresión regular con su biblioteca,
\p{charclass}
se reemplaza con[allthecharactersintheclass]
.fuente
Los escapes de propiedades Unicode se encuentran entre las características de ES2018.
Uso básico
Con Unicode Property Escapes, puede hacer coincidir una letra de cualquier idioma con la siguiente expresión regular simple:
O con la taquigrafía, incluso terser:
Palabras coincidentes
Sobre el caso de la pregunta uso concreto (palabras coincidentes), nota que puede utilizar Unicode Propiedad Escapes en las clases de caracteres, por lo que es fácil para que coincida con las letras junto con otras palabras-personajes como guiones:
Al unirlo todo, podría unir palabras de todos [1] idiomas con este RegEx maravillosamente corto:
Ejemplo (descaradamente enchufado de la respuesta anterior ):
Soporte de navegador
A partir de ahora (diciembre de 2018), solo pude probar esta expresión regular con éxito en Chrome (y otros navegadores basados en Blink, como Opera, Vivaldi o futuras versiones de Microsoft Edge) y Safari (a partir de la versión 12, Pruebas anteriores con la versión 11 ha fallado). Sin embargo, dado que la especificación está terminada y la característica está estandarizada, espere que otros navegadores modernos la sigan pronto.
Hice un pequeño sitio web para que verifiques si tu navegador es compatible con Unicode Property Escapes.
Transpiling
Los escapes de propiedades Unicode pueden transferirse a ES5 con una herramienta llamada regexpu . Hay una demostración en línea disponible aquí . Como puede ver en la demostración, de hecho puede hacer coincidir las letras no latinas de hoy con la siguiente (horriblemente larga) expresión regular ES5:
Si está utilizando Babel, también hay un complemento regexpu para eso ( complemento Babel v6 , complemento Babel v7 ).
fuente
u
indicador se introdujo en ES2015 y habilita varias funciones relacionadas con Unicode (por ejemplo, los escapes de propiedad mencionados en mi respuesta, a pesar de que solo se introdujeron un par de años después). Dado que las características relacionadas con Unicode cambian ligeramente la semántica de algunos patrones de expresiones regulares, esto tiene que habilitarse explícitamente, agregando esau
bandera.La respuesta dada por Jeremy Ruten es excelente, pero creo que no es exactamente lo que Paul Wicks estaba buscando. Si entiendo correctamente, Paul preguntó sobre la expresión para que coincida con palabras que no están en inglés como
können
omóc
. La expresión regular de Jeremy solo coincide con letras que no están en inglés, por lo que hay una pequeña mejora:o
Esto
[^\x00-\x7F]
y esto[^\u0000-\u007F]
partes permiten que la expresión regular coincida con letras que no están en inglés.Esto
(|)
es lógico o\w
es una letra inglesa, por([^\u0000-\u007F]|\w)
lo que coincidirá con una sola letra inglesa o no inglesa.+
al final de la expresión significa que podría repetirse, por lo que toda la expresión permite que todas las letras en inglés o no inglés coincidan.Aquí puede probar la primera expresión con varias cadenas y aquí está la segunda.
fuente
Hace lo mismo que cualquier otra coincidencia de caracteres, pero usa \ uXXXX donde XXXX es el número unicode del carácter.
Mire: http://unicode.org/charts/charindex.html
http://unicode.org/charts/
http://www.decodeunicode.org/
fuente
Todos los sabores Regex habilitados para Unicode deben tener una clase de caracteres especial como \ w que coincida con cualquier letra Unicode. Echa un vistazo a tu sabor específico aquí .
fuente
Tuve un problema con \ p trabajando como se esperaba, así que simplemente usé una estrategia diferente como:
Encuentre cualquier cosa que no sea un carácter de tabulación hasta el siguiente carácter de tabulación ... obviamente, esto depende de su fuente de búsqueda, pero se entiende la idea. Ahora no tengo que averiguar qué caracteres Unicode funcionan y cuáles no funcionan, etc.
fuente