如何替换字符串中的特殊字符?

113
我有一个包含许多特殊字符的字符串,我想去掉所有特殊字符,但保留字母字符。如何做到这一点?

请查看此线程:https://dev59.com/Bk_Ta4cB1Zd3GeqPCaT_ - Cyril Gandon
10个回答

211

这取决于你的意思。如果你只是想摆脱它们,那就这样做:
(更新:显然你想保留数字,这种情况下请使用第二行)

String alphaOnly = input.replaceAll("[^a-zA-Z]+","");
String alphaAndDigits = input.replaceAll("[^a-zA-Z0-9]+","");

或者等效的代码:

String alphaOnly = input.replaceAll("[^\\p{Alpha}]+","");
String alphaAndDigits = input.replaceAll("[^\\p{Alpha}\\p{Digit}]+","");

通过预编译正则表达式模式并将其存储在常量中,所有这些都可以显着改进。

或者,使用 Guava

private static final CharMatcher ALNUM =
  CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z'))
  .or(CharMatcher.inRange('0', '9')).precomputed();
// ...
String alphaAndDigits = ALNUM.retainFrom(input);

但是如果你想将带重音符号的字符转换为仍为ASCII的可读内容,请参考以下问题:


当我使用这个函数时,它会将所有数字都删除。但是我不想删除数字,只想删除特殊字符。请给予建议。 - Tanu
好的,你说你只想要字母表。但我会在一分钟内更新我的答案。 - Sean Patrick Floyd
我想要连接字符串,但需要满足以下条件:
  1. 如果只有一个结果,则无需连接
  2. 如果结果超过1个,则按以下形式连接字符串:例如:stack+over+flow
- Tanu
2
@Tanu,那是一个不同的问题。请提出一个新问题。 - Pekka
它缺少π符号。 - Bugs Happen
显示剩余2条评论

85

我正在使用这个。

s = s.replaceAll("\\W", ""); 

它替换字符串中的所有特殊字符。
这里:
\w:一个单词字符,等同于 [a-zA-Z_0-9]
\W:一个非单词字符

无法处理<script>alert('XSS Attack')</script>。如何删除'<','>',''字符? - Manoj

15

您可以使用以下方法来保留字母数字字符。

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

如果您只想保留字母字符,请使用以下方法

replaceAll("[^a-zA-Z]", "");

6
使用 replaceAll("[^a-zA-Z0-9 ]", ""); 进行空格处理。 - Qamar

8

将任何特殊字符替换为

replaceAll("\\your special character","new character");

例如:将所有出现的*替换为空格

replaceAll("\\*","");

*这个语句只能一次替换一种特殊字符


当我看到问题标题“如何替换字符串中的特殊字符?”时,这绝对是我寻找的答案。谢谢! - Mr.Drew

8

跟随Andrzej Doyle的回答的例子,我认为更好的解决方案是使用org.apache.commons.lang3.StringUtils.stripAccents()函数:

package bla.bla.utility;

import org.apache.commons.lang3.StringUtils;

public class UriUtility {
    public static String normalizeUri(String s) {
        String r = StringUtils.stripAccents(s);
        r = r.replace(" ", "_");
        r = r.replaceAll("[^\\.A-Za-z0-9_]", "");
        return r;
    }
}

2
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");

除了空格、逗号和与符号外,所有的特殊字符都被替换掉了。你还可以通过以下正则表达式来省略空格、逗号和与符号。
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9_]|^\s)", "");

输入(Input)是我们需要替换字符的字符串。


2
这是我用来从字符串中删除所有可能的特殊字符的函数。
let name = name.replace(/[&\/\\#,+()$~%!.„'":*‚^_¤?<>|@ª{«»§}©®™ ]/g, '').toLowerCase();

你能稍微解释一下正则表达式吗? - stdunbar
我建议您在答案部分添加注释以解释您的代码。请阅读有关如何撰写良好答案的更多信息。 - Joe Ferndz

0

0

你可以在Windows电脑的字符映射工具中获取那个垃圾字符的Unicode,并添加\u,例如版权符号的Unicode为\u00a9。 现在,你可以使用该字符串与特定的垃圾字符,不要删除任何垃圾字符,而是用正确的Unicode替换。


0

对于空格,请使用“[^a-z A-Z 0-9]”这个模式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接