¿Cómo se especifica un rango de caracteres regex que funcionará en otros idiomas europeos además del inglés?

Estoy trabajando con el motor de expresiones regulares de Ruby. Necesito escribir una expresión regular que haga esto

WIKI_WORD = /\b([a-z][\w_]+\.)?[A-Z][a-z]+[A-Z]\w*\b/

pero también funcionará en otros idiomas europeos además del inglés. No creo que el rango de caracteres [az] cubra letras minúsculas en alemán, etc.

preguntado el 15 de febrero de 11 a las 14:02

¿Qué versión de Ruby estás usando? -

Por lo general, Ruby 1.9. Puedo requerir Ruby 1.9 en mi gema si es necesario. -

Según tengo entendido, Ruby 1.9 tiene mucho mejor soporte Unicode que 1.8 <, así que supongo que la sugerencia de Tim debería funcionar con 1.9. -

2 Respuestas

WIKI_WORD = /\b(\p{Ll}\w+\.)?\p{Lu}\p{Ll}+\p{Lu}\w*\b/u

debería funcionar en Ruby 1.9. \p{Lu} y \p{Ll} son abreviaturas para letras Unicode mayúsculas y minúsculas. (\w ya incluye el guión bajo)

Véase también esta respuesta - es posible que deba ejecutar Ruby en modo UTF-8 para que esto funcione, y posiblemente su script también deba estar codificado en UTF-8.

contestado el 23 de mayo de 17 a las 15:05

¿Qué hacen \ py / u al final? - Dan

\p es una abreviatura de Propiedad de carácter Unicode. /u es el modificador Unicode. Parece ser necesario decirle a Ruby que debería interpretar la expresión regular en modo Unicode, pero no estoy realmente seguro de esto, y aún no he encontrado una documentación concluyente sobre esto. La mayoría de las cosas que tengo todavía son para Ruby 1.8. - Tim Pietzcker

Según Programming Ruby 1.9, cuando se construye una expresión regular a partir de una cadena, "la codificación de la cadena determina la codificación de la expresión regular". Entonces, a menos que se especifique lo contrario, el argumento de cadena se codificará usando Encoding.default_external, que por defecto es UTF-8. Creo. - zetético

StackOverflow podría y probablemente debería usar algo más parecido a su patrón WɪᴋɪWᴏʀᴅ. Me di cuenta en esta respuesta que no estaban usando \p{Lu} correctamente, porque perdió mi identificador griego. (Sí, sé que puede ser de mal gusto; solo estaba jugando). tchrist

James Gray escribió un serie de artículos sobre cómo trabajar con Unicode, UTF-8 y Ruby 1.8.7 y 1.9.2. Son lecturas importantes.

Con Ruby 1.8.7, podríamos agregar:

#!/usr/bin/ruby -kU
require 'jcode'

y obtenga soporte UTF-8 parcial.

Con 1.9.2 puedes usar:

# encoding: UTF-8

como la segunda línea de su archivo fuente y eso le dirá a Ruby que por defecto sea UTF-8. La recomendación de Grey es que lo hagamos con todas las fuentes que escribamos a partir de ahora.

Eso no afectará la codificación externa al leer / escribir texto, solo la codificación del código fuente.

Ruby 1.9.2 no extiende lo habitual \w, \W y \s clases de caracteres para manejar UTF-8 o Unicode. Como dijeron los otros comentarios y respuestas, solo los conjuntos de caracteres POSIX y Unicode en expresiones regulares hacen eso.

Respondido 15 Feb 11, 21:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.