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

Ste*_*iks 28 java regex

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

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

String result = cleaner.getCleanedString(dirtyString);
Run Code Online (Sandbox Code Playgroud)

期待结果将是:

"Thiscontainsspaceswhicharenotallowed"
Run Code Online (Sandbox Code Playgroud)

一个更好的例子:

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

String result = cleaner.getCleanedString(dirtyString);
Run Code Online (Sandbox Code Playgroud)

我希望结果如下:

"thisisaverydirtyString"
Run Code Online (Sandbox Code Playgroud)

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

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

另外:如果你认为清洁字符串可以不同/更好地完成,那么我当然也都是耳朵

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

jzd*_*jzd 49

根据您的更新编辑:

dirtyString.replaceAll("[^a-zA-Z0-9]","")
Run Code Online (Sandbox Code Playgroud)


Cow*_*wan 13

如果你在你的项目中使用guava(如果你不是,我相信你应该考虑它),CharMatcher类非常好地处理它:

你的第一个例子可能是:

result = CharMatcher.WHITESPACE.removeFrom(dirtyString);
Run Code Online (Sandbox Code Playgroud)

而你的第二个可能是:

result = CharMatcher.anyOf(" *#&").removeFrom(dirtyString);
// or alternatively
result = CharMatcher.noneOf(" *#&").retainFrom(dirtyString);
Run Code Online (Sandbox Code Playgroud)

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

CharMatcher illegal = CharMatcher.WHITESPACE.or(CharMatcher.anyOf("*#&"));
result = illegal.removeFrom(dirtyString);
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

随后retainFrom(dirtyString)如上.

非常好,功能强大的API.


tro*_*foe 6

这样做:

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

并通过用'nothing'替换所有空格来工作.


Tim*_*ker 5

String resultString = subjectString.replaceAll("\\P{L}+", "");
Run Code Online (Sandbox Code Playgroud)

将用任何东西替换任何非字母字符.