如何使用正则表达式过滤字符串中不需要的字符?

新手上路,请多包涵

基本上,我想知道是否有方便的类或方法来过滤字符串中不需要的字符。该方法的输出应该是“已清理”的字符串。 IE:

 String dirtyString = "This contains spaces which are not allowed"

String result = cleaner.getCleanedString(dirtyString);

预期结果将是:

 "Thiscontainsspaceswhicharenotallowed"

一个更好的例子:

 String reallyDirty = " this*is#a*&very_dirty&String"

String result = cleaner.getCleanedString(dirtyString);

我希望结果是:

 "thisisaverydirtyString"

因为,我让清洁工知道 ‘ ‘、’*‘、’#‘、’&’ 和 ‘_’ 是脏字符。我可以通过使用字符的白/黑列表数组来解决它。但我不想重新发明轮子。

我想知道是否已经存在可以使用正则表达式“清理”字符串的东西。而不是自己写这个。

补充:如果你认为清理字符串可以用不同的方式/更好的方式完成,那么我当然也洗耳恭听

另一个补充: - 它不仅适用于空格,还适用于任何类型的字符。

原文由 Stefan Hendriks 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 431
2 个回答

根据您的更新编辑:

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

原文由 jzd 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果你在你的项目中使用 番石榴(如果你没有,我相信你应该考虑一下), CharMatcher 类可以很好地处理这个问题:

你的第一个例子可能是:

 result = CharMatcher.WHITESPACE.removeFrom(dirtyString);

而你的第二个可能是:

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

或者如果你想更灵活地使用空格(制表符等),你可以将它们组合起来而不是编写你自己的:

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

或者您可以改为指定合法字符,这取决于您的要求可能是:

 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

其次是 retainFrom(dirtyString) 如上。

非常好,强大的API。

原文由 Cowan 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题