2009-11-30 15 views
29

Estoy buscando una expresión regular en Java que coincida con todos los caracteres de espacios en blanco en una Cadena. "\ s" coincide solo con algunos, no coincide con   y espacios en blanco que no sean ascii similares. Estoy buscando una expresión regular que coincida con todos los caracteres de espacio en blanco (comunes) que pueden aparecer en Java String.Expresión regular de Java para hacer coincidir todos los caracteres de _all_ whitespace

[Editar]

Para aclarar: no me refiero a la secuencia de cadena " " I significa el carácter sincle Unicode U + 00A0 que a menudo está representado por " ", por ejemplo, en HTML, y todos los demás caracteres Unicode con un meainig similar en espacio en blanco, p. "NARROW NO-BREAK SPACE" (U + 202F), Word joiner codificado en Unicode 3.2 y superior como U + 2060, "ZERO WIDTH NO-BREAK SPACE" (U + FEFF) y cualquier otro carácter que se pueda volver a clasificar como blanco- espacio.

[Respuesta]

Por mi pupose, es decir, la captura de todos los caracteres de espacio en blanco, Unicode + tradicional, la siguiente expresión se encarga del trabajo:

[\p{Z}\s]

La respuesta está en los comentarios a continuación, pero desde está un poco escondido lo repito aquí.

+2

Para que quede claro, qué se refiere literalmente ** ** ''   o su salida de '\ u00A0'? Eso hace la diferencia. – BalusC

+0

  ¿salida? Salida por qué? –

+1

@Vinko: El navegador web, por ejemplo. – BalusC

Respuesta

11

El   es solo espacios en blanco en HTML. Use un HTML parser para extraer el texto sin formato. y \s debería funcionar bien.

+0

El ' ' genera '\ u00A0' al final. – BalusC

+0

@BalusC: sí, pero es importante que cualquier definición correcta de "carácter de espacio en blanco" en el contexto de expresiones regulares solo pueda incluir U + 00A0 que se produce "al final", pero nunca puede incluir el literal "'   '". De eso se trata el "Estás mezclando niveles de abstracción aquí" de la respuesta de Vinkos (si lo entendí correctamente). –

+15

@BalusC: No sabía que HTLM Parser lo hizo. Puede usar '\ p {Z}' en lugar de '\ s' para que coincida con el espacio en blanco, coincidirá con' \ u00A0' – Andomar

35

& nbsp; no es un personaje de espacio en blanco, en lo que concierne a las expresiones regulares. Necesita modificar la expresión regular para incluir esas cadenas además de \ s, como/(\ s | & nbsp; |% 20) /, o analizar previamente el contenido de la cadena para obtener la representación ASCII o Unicode de los datos.

Aquí está mezclando niveles de abstracción.

Si, lo que después de un cuidadoso de nueva lectura de la cuestión parece ser el caso, usted está después de una manera para que coincida con todos los espacios en blanco que se refieren a ASCII estándar, además de los puntos de código de espacio en blanco, o \p{Z}\p{Zs} va a hacer el trabajo.

Realmente debería aclarar su pregunta porque ha confundido a mucha gente (incluso haciendo la respuesta correcta para tener algunos votos a la baja).

+0

'\ p {javaWhitespace}' no parece coincidir con '& nbsp' (U + 00A0). – Carsten

+11

Use '\ p {Z}' o '\ p {Zs}' en su lugar. Lo probé en Java, y coinciden con U + 00A0. –

+1

[\ p {Z} \ s] parece hacer el truco! ¡Gracias! – Carsten

2

  no es un espacio en blanco. Es una secuencia de codificación de caracteres que representa espacios en blanco en HTML. Lo más probable es que desee convertir texto codificado en HTML en texto sin formato antes de ejecutar su coincidencia de cadenas en su contra. Si ese es el caso, busque javax.swing.text.html

+1

Lol. Parece que el desbordamiento de pila toma su ''   'inicial literalmente. – Andomar

11

Se aclaró la cuestión de la manera como lo esperaba: en realidad no está buscando la cadena literal   como muchos aquí parece pensar y para la cual la solución es demasiado obvia.

Bueno, desafortunadamente, no hay forma de combinarlos usando expresiones regulares. Lo mejor es incluir los puntos de código particulares en el patrón, por ejemplo: "[\\s\\xA0]".

Editar que resultó en uno de los comentarios, se podría utilizar el undocumented"\\p{Z}" para esto. Alan, ¿puedes dejar un comentario sobre cómo lo descubriste? Este es bastante útil.

+3

Es uno de los (muchos) shorthands de propiedad Unicode estándar. Se mencionan en los documentos de la API de patrones, aunque este no se encuentra entre los ejemplos. Aquí hay una buena visión general: http://www.regular-expressions.info/unicode.html#prop Pero no es tan útil como podría ser: no coincide con los avances de línea, las pestañas o (al parecer) con ningún otro espacio en blanco ASCII excepto el espacio (U + 0020). Tal vez es por eso que nunca has oído hablar de eso. :) –

+0

Gracias por la descripción. Realmente no esperaba que los indocumentados también funcionaran en el motor de expresiones regulares de Java. Eso significaría que el doc API está incompleto (lo que realmente no esperaría de los chicos de Sun, ya sabes). – BalusC

+0

Molesto que '\ s' no concuerde' \ xA0' -______________________- – ThorSummoner

3

He aquí un resumen que hice de varias definiciones de la competencia de "espacios en blanco":

http://spreadsheets.google.com/pub?key=pd8dAQyHbdewRsnE5x5GzKQ

Es posible que al final tener que enumerar explícitamente las adicionales que le interesan que no son igualados por una de las prefabricados.

+0

La biblioteca de Guava hace referencia a esta lista como una "comparación de varias definiciones de 'espacio en blanco'" ([fuente] (http: //docs.guava-libraries) .googlecode.com/git/javadoc/com/google/common/base/CharMatcher.html # WHITESPACE)). Sin embargo, Kevin, deberías regalar tus fuentes. Además, me pregunto para qué sirve ese signo de asterisco en la columna "StreamTokenizer; String.trim()". Y ... ¿cuál es el primer carácter en la lista ... algo "(00-08)"? –

+1

El enlace está muerto. –

1

En caso de que alguien se encuentra con esta pregunta de nuevo en busca de ayuda, sugiero seguir la siguiente respuesta: https://stackoverflow.com/a/6255512/1678392

La versión corta: \\p{javaSpaceChar}

Por qué: Por la Pattern class, esto mapea la Character.isSpaceChar método:

Categorías que se comportan como el booleano es java.lang.Character methodName métodos (a excepción de las obsoletas unos) ar e disponible a través de la misma sintaxis \ p {prop} donde la propiedad especificada tiene el nombre java methodname.

Cuestiones relacionadas