¿Quitar todos los caracteres que no sean “palabras” de una cadena en Java, dejando caracteres acentuados?

Aparentemente, el sabor Regex de Java cuenta los diéresis y otros caracteres especiales como “caracteres de palabra” cuando utilizo Regex.

"TESTÜTEST".replaceAll( "\\W", "" ) 

devuelve “TESTTEST” para mí. Lo que quiero es que solo se eliminen todos los “personajes de palabras” que realmente no sean “personajes de palabras”. Cualquier forma de hacer esto sin tener algo a lo largo de las líneas de

  "[^A-Za-z0-9äöüÄÖÜßéèáàúùóò]" 

solo para darme cuenta de que olvidé ô?

Utilice [^\p{L}\p{Nd}]+ – esto coincide con todos los caracteres (Unicode) que no son letras ni dígitos (decimales).

En Java:

 String resultString = subjectString.replaceAll("[^\\p{L}\\p{Nd}]+", ""); 

Editar:

Cambié \p{N} a \p{Nd} porque el primero también coincide con algunos símbolos numéricos como ¼ ; este último no. Véalo en regex101.com .

Estaba tratando de lograr exactamente lo contrario cuando choqué con este hilo. Sé que es bastante viejo, pero esta es mi solución, no obstante. Puedes usar bloques, mira aquí . En este caso, compile el siguiente código (con las importaciones correctas):

 > String s = "äêìóblah"; > Pattern p = Pattern.compile("[\\p{InLatin-1Supplement}]+"); // this regex uses a block > Matcher m = p.matcher(s); > System.out.println(m.find()); > System.out.println(s.replaceAll(p.pattern(), "#")); 

Debería ver el siguiente resultado:

cierto

#paja

Mejor,

A veces no desea simplemente eliminar los caracteres, sino simplemente eliminar los acentos. Se me ocurrió la siguiente clase de utilidad que utilizo en mis proyectos web REST de Java cada vez que necesito incluir un String en una URL:

 import java.text.Normalizer; import java.text.Normalizer.Form; import org.apache.commons.lang.StringUtils; /** * Utility class for String manipulation. * * @author Stefan Haberl */ public abstract class TextUtils { private static String[] searchList = { "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß" }; private static String[] replaceList = { "Ae", "ae", "Oe", "oe", "Ue", "ue", "sz" }; /** * Normalizes a String by removing all accents to original 127 US-ASCII * characters. This method handles German umlauts and "sharp-s" correctly * * @param s * The String to normalize * @return The normalized String */ public static String normalize(String s) { if (s == null) return null; String n = null; n = StringUtils.replaceEachRepeatedly(s, searchList, replaceList); n = Normalizer.normalize(n, Form.NFD).replaceAll("[^\\p{ASCII}]", ""); return n; } /** * Returns a clean representation of a String which might be used safely * within an URL. Slugs are a more human friendly form of URL encoding a * String. * 

* The method first normalizes a String, then converts it to lowercase and * removes ASCII characters, which might be problematic in URLs: *

    *
  • all whitespaces *
  • dots ('.') *
  • (semi-)colons (';' and ':') *
  • equals ('=') *
  • ampersands ('&') *
  • slashes ('/') *
  • angle brackets ('<' and '>') *
* * @param s * The String to slugify * @return The slugified String * @see #normalize(String) */ public static String slugify(String s) { if (s == null) return null; String n = normalize(s); n = StringUtils.lowerCase(n); n = n.replaceAll("[\\s.:;&=<>/]", ""); return n; } }

Siendo un hablante de alemán, también he incluido el manejo adecuado de diéresis alemanes – la lista debería ser fácil de extender para otros idiomas.

HTH

EDITAR: tenga en cuenta que puede no ser seguro incluir el String devuelto en una URL. Al menos debe codificar HTML para evitar ataques XSS.

Bueno, aquí hay una solución con la que terminé, pero espero que haya una más elegante …

 StringBuilder result = new StringBuilder(); for(int i=0; i 

result termina con el resultado deseado ...

Es posible que desee eliminar primero los signos acentos y signos diacríticos , luego en cada posición del personaje compruebe si la cadena “simplificada” es una letra ascii; si lo es, la posición original debe contener caracteres verbales, si no, puede eliminarse.

Puedes usar StringUtils de apache