2011-02-04 22 views
11

Me considero bastante bueno con las expresiones regulares, pero éste está apareciendo a ser sorprendentemente difícil: Quiero recortar todo espacios en blanco, excepto el carácter de espacio: ' '.Extracción de todos los espacios en blanco a excepción de ""

En Java, el RegEx que he intentado es: [\s-[ ]], pero este también elimina ' '.

ACTUALIZACIÓN:

Aquí es la cadena particular que estoy tratando de despojar a los espacios de:

project team    manage key

Nota: sería entre los caracteres "equipo" y "gestionar". Aparecen como un espacio largo al editar esta publicación, pero se ven como un único espacio en el modo de visualización.

+0

Puede reemplazar todos los espacios con un carácter que sabe que no estará presente, eliminar todos los espacios en blanco y cambiar el carácter especial a un espacio. –

+0

Verdadero (este truco en realidad ya se me ocurrió) y sospecho que funcionaría, pero requeriría tres reemplazos en lugar de uno. –

+1

Entonces ... uh ... ¿le gustaría que su cadena de salida lea 'project teammanage key'? – CanSpice

Respuesta

20

Trate de usar esta expresión regular:

[^\S ]+ 

Es un poco confuso para leer debido a la doble negación. La expresión regular [\S ] coincide con los caracteres que desea conservar, es decir, un espacio o cualquier cosa que no sea un espacio en blanco. La clase de caracteres negada [^\S ] debe coincidir con todos los caracteres que desea eliminar.

+0

Buena idea, pero esto en realidad no funcionó. Esto parece lógicamente equivalente a mi intento original (que usa sustracción). Estoy empezando a pensar que necesito especificar rangos y/o caracteres específicos para pelar, lo cual es desafortunado. –

+0

Debo notar que si hago un reemplazo todo en "\ s", elimina todos los espacios en blanco, pero también se quita "", que es demasiado agresivo. –

+0

Debe funcionar ... y lo hace. Pruebe 'System.out.println (" \ t aaa \ t \ n ".replaceAll (" [^ \\ S] "," ") .getBytes());'. – maaartinus

6

El uso de un GuavaCharMatcher:

String text = ... 
String stripped = CharMatcher.WHITESPACE.and(CharMatcher.isNot(' ')) 
    .removeFrom(text); 

Si en realidad sólo quiere que se recorta desde el principio y final de la cadena (como String.trim()) tendrá que utilizar trimFrom en lugar de removeFrom.

+0

La definición de espacios en blanco aquí difiere de la utilizada por \ s. Es mejor (más cercano al estándar Unicode). – maaartinus

3

No hay resta de clases de caracteres en Java, de lo contrario podría usar [\s--[ ]], tenga en cuenta el doble guión. Siempre se puede simular el conjunto resta utilizando intersección con el complemento, por lo

[\s&&[^ ]] 

debería funcionar. No es mejor que [^\S ]+ desde la primera respuesta, pero el principio es diferente y es bueno saber ambos.

+0

Esto tampoco está funcionando. Estoy bastante sorprendido: parece que eliminar un juego en "\ s". –

Cuestiones relacionadas