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

时间:2011-02-09 13:47:44

标签: java regex

基本上,我想知道是否有一个方便的类或方法来过滤不需要的字符的字符串。方法的输出应该是'clean'字符串。即:

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"

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

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

增加: 如果你认为清理一个字符串可以做得不同/更好,那么我当然也是耳朵

另外一个补充: - 它不仅适用于空间,也适用于任何类型的角色。

6 个答案:

答案 0 :(得分:48)

根据您的更新进行编辑:

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

答案 1 :(得分:13)

如果您在项目中使用guava(如果不是,我相信您应该考虑它),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。

答案 2 :(得分:9)

使用replaceAll

答案 3 :(得分:6)

这样做:

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

并使用'nothing'替换所有空格。

答案 4 :(得分:5)

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

将替换所有非字母字符。

答案 5 :(得分:0)

我也更喜欢白名单方法。你永远都不会知道到底是什么。似乎比字符更多的编码。这样你可以控制它:

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

这包含所有德语变音符号和法语口音......你知道 - 只需看看你的键盘。我想我已经把它们都拿走了。 随意省略特殊字符,如&lt; &GT;防止代码注入...