2009-09-26 14 views
8

Bueno, estoy buscando una expresión regular en Java que elimine todas las palabras de menos de 3 caracteres. Pensé que algo como \s\w{1,2}\s tomaría todas las palabras de 1 y 2 letras (un espacio en blanco, caracteres de una a dos palabras y otro espacio en blanco), pero simplemente no funciona. ¿Dónde estoy equivocado?Expresión regular eliminando todas las palabras más cortas que n

+0

Todas las palabras en una cadena de menos de 3, o una palabra a la vez? –

+0

todas las palabras en un solo pasaje, simplemente no las necesito. – janesconference

Respuesta

11

Lo tengo funcionando bastante bien, pero me llevó dos pasadas.

public static void main(String[] args) { 
    String passage = "Well, I'm looking for a regexp in Java that deletes all words shorter than 3 characters."; 
    System.out.println(passage); 

    passage = passage.replaceAll("\\b[\\w']{1,2}\\b", ""); 
    passage = passage.replaceAll("\\s{2,}", " "); 

    System.out.println(passage); 
} 

La primera pasada reemplaza todas las palabras que contienen menos de tres caracteres con un solo espacio. Tenga en cuenta que tuve que incluir el apóstrofo en la clase de personaje para eliminar porque la palabra "Yo soy" me estaba dando problemas sin eso. Puede encontrar otros caracteres especiales en su texto que también debe incluir aquí.

El segundo pase es necesario porque la primera pasada dejó unos pocos lugares donde había espacios dobles. Esto simplemente colapsa todas las ocurrencias de 2 o más espacios hasta uno. Depende de usted si necesita mantener esto o no, pero creo que es mejor con los espacios colapsados.

Salida:

Bien, estoy buscando una expresión regular en Java que elimina todas las palabras de menos de 3 caracteres.

Bueno, en busca de regexp Java que elimine todas las palabras más cortas que los caracteres.

+0

Sí, esto funciona bastante bien. – janesconference

+0

FYI - haría "No lo puedo creer" => "Puede creerlo" – krinker

1

Probar: \b\w{1,2}\b aunque todavía tendrá que deshacerse de los espacios del doble que aparecerán.

3

Si no desea que el espacio en blanco emparejado, es posible que desee utilizar

\b\w{1,2}\b 

para obtener los límites de palabras.

que está trabajando para mí en RegexBuddy usando el sabor de Java; para la cadena de prueba

"El perro es un gato divertido"

destaca que "es" y "a". Del mismo modo para las palabras al comienzo/final de una línea.

Es posible que desee publicar un código de muestra.

(Y, como GameFreak acaba de publicar, usted todavía termina con espacios dobles.)

EDIT:

\b\w{1,2}\b\s? 

es otra opción. Esto arreglará parcialmente el problema de eliminación de espacio, aunque las palabras al final de una cadena o seguidas de signos de puntuación todavía pueden causar problemas. Por ejemplo, "Un perro es divertido, ¿no?" se convierte en "perro divertido?" En cualquier caso, todavía tendrá problemas con el uso de mayúsculas (el perro ahora debería ser Dog).

+0

Por favor deje un comentario cuando downvoting. Estaba componiendo esto al mismo tiempo que GameFreak publicó su respuesta; No lo copié simplemente. – TrueWill

+0

te modifiqué. – janesconference

+0

¡Gracias @janesconference! :) – TrueWill

1

Si usted tiene una cadena como esta:

hello there my this is a short word 

Esta expresión regular coincidirá con todas las palabras en la cadena mayor o igual a 3 caracteres de longitud:

\w{3,} 

El resultado es:

hello there this short word 

Eso, para mí, es el método más sencillo. ¿Por qué tratar de hacer coincidir lo que no quiere, cuando puede hacer coincidir lo que quiere mucho más fácil? Sin espacios dobles, sin restos, y la puntuación está bajo su control. Los otros enfoques se rompen en espacios múltiples y no son muy robustos.

+0

Parece una buena idea, pero actualmente estoy usando GWT y solo tengo los métodos regex de la clase String. Así que puedo dividir mi cadena o reemplazar mis expresiones regulares, pero no sé cómo obtener solo las cosas que combiné :( – janesconference

Cuestiones relacionadas