2010-06-15 13 views
6

Estoy tratando de crear una expresión regular de Java para dividir cadenas del formato general "foo - bar" en "foo" y "barra" usando Pattern.split(). El carácter "-" puede ser uno de varios guiones: el ASCII '-', el guión largo, el doble guión, etc. Yo he construido la siguiente expresión regular:Coincidencia de guiones Unicode en expresiones regulares de Java?

private static final Pattern titleSegmentSeparator = Pattern.compile("\\s(\\x45|\\u8211|\\u8212|\\u8213|\\u8214)\\s"); 

el cual, si Estoy leyendo la documentación del patrón correctamente, debería capturar cualquiera de los guiones Unicode o el ascii dash, cuando esté rodeado en ambos lados por espacios en blanco. Estoy usando el patrón de la siguiente manera:

String[] sectionSegments = titleSegmentSeparator.split(sectionTitle); 

No joy. Para la entrada de muestra siguiente, el guión no se detecta y titleSegmentSeparator.matcher (sectionTitle) .find() devuelve falso!

Para asegurarme de que no me faltaba ninguna entidad de carácter inusual, utilicé System.out para imprimir algunos datos de depuración. El resultado es el siguiente: a cada carácter le sigue la salida de (int) char, que debería ser su 'punto de código unicode', ¿no?

entrada

muestra:

Estudio Resumen (1 de 10) - Competencia

S (83) t (116) u (117) d (100) y (121) (32) S (83) u (117) m (109) m (109) a (97) r (114) y (121) (32) ((40) 1 (49) (32) o (111) f (102) (32) 1 (49) 0 (48)) (41) (32) - (8211) (32) C (67) o (111) m (109) p (112) e (101) t (116) i (105) t (116) i (105) o (111) n (110)

Es me parece que ese dash es el punto de código 8211, que debería ser igualado por la expresión regular, ¡pero no lo es! ¿Que está pasando aqui?

+0

A partir de los documentos: "las cuerdas '\ u2014' y '\\ u2014', mientras que no es igual, compilar en el mismo patrón, que coincide con el carácter con el valor 0x2014 hexadecimal. " Es decir, puedes eliminar el doble \\ en tu expresión. – aioobe

+0

@aioobe: ¡Qué gran coincidencia es que los documentos de Java hayan usado exactamente un personaje como ejemplo de lo que se trata esta pregunta. ¿O modificaste la cita? –

+2

coincidencia :-) – aioobe

Respuesta

12

Está mezclando decimal (8211) y hexadecimal (0x8211).

\x y \u tanto esperan que un número hexadecimal, por lo tanto, que había necesidad de utilizar \u2014 para que coincida con el guión largo, no \u8211 (y \x2D para el guión etc. normal).

¿Pero por qué no simplemente usar la propiedad Unicode "Dash puntuacion"?

Como cadena de Java: "\\s\\p{Pd}\\s"

+0

Por desgracia, Java no admite la propiedad 'Dash' de Unicode en sus expresiones regulares, que incluye elementos como el SIGNO DE MENOS, que es de tipo Símbolo. – tchrist

Cuestiones relacionadas