java - probar - ¿Cómo filtrar la cadena de caracteres no deseados utilizando expresiones regulares?
validar expresiones regulares c++ (6)
Editado basado en su actualización:
dirtyString.replaceAll("[^a-zA-Z0-9]","")
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);
El resultado esperado 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, le digo al limpiador que '''', ''*'', ''#'', ''&'' y ''_'' son caracteres sucios. Puedo resolverlo usando una lista de caracteres de lista blanca / negra. Pero no quiero reinventar la rueda.
Me preguntaba si ya existe tal cosa que pueda "limpiar" las cadenas con una expresión regular. En lugar de escribir esto yo mismo.
Adición: si crees que limpiar una Cuerda se podría hacer de manera diferente / mejor, entonces yo también lo soy todo.
Otra adición: - No es solo para espacios, sino para cualquier tipo de personaje.
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".
Si está utilizando guava 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 tu segundo podría ser:
result = CharMatcher.anyOf(" *#&").removeFrom(dirtyString);
// or alternatively
result = CharMatcher.noneOf(" *#&").retainFrom(dirtyString);
o si quieres ser más flexible con los espacios en blanco (pestañas, etc.), puedes combinarlos en lugar de escribir los tuyos:
CharMatcher illegal = CharMatcher.WHITESPACE.or(CharMatcher.anyOf("*#&"));
result = illegal.removeFrom(dirtyString);
o en su lugar, puede 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 de retainFrom(dirtyString)
como se retainFrom(dirtyString)
arriba.
Muy bonito, potente API.
También prefiero el enfoque de lista blanca. Nunca sabrás lo que viene. Parece que hay más codificaciones que caracteres. De esta manera 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 alemanas y acentos franceses y ... ya sabes, basta con mirar el teclado. Creo que los escogí a todos. Siéntase libre de omitir caracteres especiales como <> para evitar la inyección de código ...
Utilice replaceAll
.
String resultString = subjectString.replaceAll("//P{L}+", "");
reemplazará cualquier carácter que no sea letra por nada.