¿Cómo se filtra la cadena de caracteres no deseados usando regex?

Básicamente, me pregunto si hay una clase o método útil para filtrar una Cadena de caracteres no deseados. La salida del método debe ser la cadena ‘limpia’. Es decir:

String dirtyString = "This contains spaces which are not allowed" String result = cleaner.getCleanedString(dirtyString); 

Esperando resultado sería:

 "Thiscontainsspaceswhicharenotallowed" 

Un mejor ejemplo:

 String reallyDirty = " this*is#a*&very_dirty&String" String result = cleaner.getCleanedString(dirtyString); 

Espero que el resultado sea:

 "thisisaverydirtyString" 

Porque, dejo saber al limpiador que ”, ‘*’, ‘#’, ‘&’ y ‘_’ son caracteres sucios. Puedo resolverlo usando una lista de caracteres en blanco / negro. Pero no quiero reinventar la rueda.

Me preguntaba si ya hay algo que pueda ‘limpiar’ cadenas usando una expresión regular. En lugar de escribir esto yo mismo.

Además: si crees que limpiar una Cadena podría hacerse de manera diferente / mejor, entonces soy todo oídos, por supuesto.

Otra adición: – No es solo para espacios, sino para cualquier tipo de personaje.

Editado en base a su actualización:

 dirtyString.replaceAll("[^a-zA-Z0-9]","") 

Si está usando guayaba en su proyecto (y si no lo está, creo que debería considerarlo), la clase CharMatcher maneja esto muy bien:

Tu primer ejemplo podría ser:

 result = CharMatcher.WHITESPACE.removeFrom(dirtyString); 

mientras que el segundo podría ser:

 result = CharMatcher.anyOf(" *#&").removeFrom(dirtyString); // or alternatively result = CharMatcher.noneOf(" *#&").retainFrom(dirtyString); 

o si desea ser más flexible con espacios en blanco (tabs, etc.), puede combinarlos en lugar de escribir los suyos propios:

 CharMatcher illegal = CharMatcher.WHITESPACE.or(CharMatcher.anyOf("*#&")); result = illegal.removeFrom(dirtyString); 

o en su lugar podría especificar caracteres legales, que según sus requisitos podrían ser:

 CharMatcher legal = CharMatcher.JAVA_LETTER; // based on Unicode char class CharMatcher legal = CharMatcher.ASCII.and(CharMatcher.JAVA_LETTER); // only letters which are also ASCII, as your examples CharMatcher legal = CharMatcher.inRange('a', 'z'); // lowercase only CharMatcher legal = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')); // either case 

seguido por retainFrom(dirtyString) como se retainFrom(dirtyString) arriba.

Muy agradable, poderosa API.

Use replaceAll .

Esto lo hará:

 String dirtyString = "This contains spaces which are not allowed"; String result = dirtyString.replaceAll("\\s", ""); 

y funciona reemplazando todos los espacios en blanco con ‘nada’.

 String resultString = subjectString.replaceAll("\\P{L}+", ""); 

reemplazará los caracteres que no sean letras y no tengan nada.

También prefiero el enfoque de lista blanca. Nunca sabrá lo que sucede. Parece que hay más codificaciones que caracteres. De esta forma puedes controlarlo todo:

 public String convert(String s) { s = StringUtils.removePattern(s, "[^A-Za-zäöüÄÖÜß?!$,. 0-9\\-\\+\\*\\?=&%\\$§\"\\!\\^#:;,_²³°\\[\\]\\{\\}<>\\|~]'`'"); return s.trim(); } 

Esto contiene todas las diéresis y acentos franceses, y … ya sabes, solo mira tu teclado. Creo que los escogí a todos. Siéntase libre de omitir caracteres especiales como <> para evitar la inyección de código …