如何从字符串中删除特殊字符?

122

我想要移除特殊字符,例如:

- + ^ . : ,

使用Java从一个字符串中获取数据。


根据你标记问题的方式,显然你已经知道正则表达式是什么了。你尝试阅读String类的文档了吗?特别是寻找关键词“regex”;有一些方法,稍加思考就能告诉你如何继续... :) - Karl Knechtel
4
“特殊字符”这个短语已经被过度使用,几乎完全失去了意义。如果您的意思是“我有一些特定字符需要删除”,那么可以像Thomas建议的那样使用正则表达式字符类构建模式,并使用replaceAll方法将它们替换掉。如果您有更奇特的要求,请编辑问题本身。 :) - Ray Toal
1
这些字符不是常见的1字节字符类型,如 - + ^ 是特殊字符:äâêíìéè。 无论如何,正如Ray所述,可以对它们进行“replaceAll”操作,或者对字符串进行解析,将不是要删除的字符添加到另一个字符串中,在最后只需将其“+ =” 到您将返回的字符串中即可。 - Gonçalo Vieira
deleteChars.apply( fromString, "-+^.:," ); – 在此处查找 deleteChars - Kaplan
8个回答

287

这取决于您如何定义特殊字符,但尝试使用replaceAll(...)

String result = yourString.replaceAll("[-+.^:,]","");

请注意,正则表达式中的 ^ 字符不可以是列表中的第一个字符,因为这样你要么需要对它进行转义,要么它会被解释成“除此之外的任何字符”。

另外一个需要注意的点是 - 字符必须是列表的第一个或最后一个字符,否则你需要对它进行转义,否则它会被解释成一个范围(例如 :-, 表示的是所有范围从 :, 的字符)。

因此,为了保持一致性并且不依赖于字符位置,请对所有在正则表达式中具有特殊含义的字符进行转义(以下列表并不完整,所以请注意其他字符,如 ({$等):

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");
如果您想要去除所有标点符号和符号,请尝试使用此正则表达式:\p{P}\p{S}(请记住,在Java字符串中,您必须转义反斜杠:"\\p{P}\\p{S}")。
第三种方法可能是像这样的东西,如果您可以明确定义应该留下什么在您的字符串中:
String  result = yourString.replaceAll("[^\\w\\s]","");
这意味着:替换所有不是单词字符(a-z任意大小写,0-9或_)或空格的内容。
编辑说明:请注意还有其他几个模式可能会有所帮助。但是,我无法对它们进行解释,因此请查看regular-expressions.info的参考部分。
这里是Ray提出的“定义允许字符”的方法的一个更少限制性的替代方案。
String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");
该正则表达式可以匹配任何语言中不是字母和分隔符(空格、换行等)的所有内容。请注意,您不能使用[\P{L}\P{Z}](大写P表示不具有该属性),因为那样会意味着“所有不是字母或不是空白符的内容”,这几乎匹配了所有东西,因为字母不是空格,反之亦然。
Unicode中的一些字符似乎会由于不同的编码方式(单个代码点或代码点组合)而导致问题。更多信息请参阅regular-expressions.info

[^\\p{L}\\p{Z}] 似乎也会消除德语umlauts(ä,ö,ü)(至少对我来说是这样的:/),因此“正则表达式匹配任何语言中不是字母的内容”似乎并不完全正确。 - Peter
1
@Peter在我的测试中,它并没有消除那些字符。可能在你的情况下存在另外的问题,例如文本的不同编码。我会附上更多信息的链接。 - Thomas
1
@Thomas String result = yourString.replaceAll("[^\\w\\s]",""); 出现错误 无效的转义序列(有效的是 \b \t \n \f \r \" \' \\) - Visruth
@VisruthCV,你需要在Java字符串中转义反斜杠,即使用"[^\\w\\s]"。我也会在我的答案中修复这个错误。 - Thomas
@Thomas 谢谢。我已经为安卓优化了你的答案:youredittextvariable.setText((youredittextvariable.getText().toString().replaceAll("[″&<>′]","")).toString()); - Abhijit Gujar
显示剩余4条评论

67

这将替换除了字母数字之外的所有字符

replaceAll("[^A-Za-z0-9]","");

3
这也会删除阿拉伯字符。 - S0haib Nasir
2
这是最好的答案。 - Marius Razvan Varvarei

18

http://developer.android.com/reference/java/util/regex/Pattern.html所述:

Pattern是已编译的正则表达式。在许多情况下,像String.matchesString.replaceAllString.split这样的便捷方法可能更可取,但如果您需要使用同一正则表达式进行大量工作,则编译一次并重复使用可能更有效率。 Pattern类及其伴侣Matcher还提供比String公开的少量功能更多的功能。

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

结果

String is = one
Number is = 9196390097

1
这将会移除阿拉伯字符。 - S0haib Nasir

15

尝试使用 String 类的 replaceAll() 方法。

顺便说一下,这是方法的返回类型和参数。

public String replaceAll(String regex,
                         String replacement)

例子:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

此代码将删除您想要删除的所有 {'^','+',' - '} 字符!


11

去除特殊字符

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

输出将为:abdd.

这个完美地运行。


1
字符串字面量中存在非法的转义字符。 - John Joe
这也将删除空格,如果您想保留空格,请使用t2 = t2.replaceAll("[^\w\s]", ""); - Isuru Dilshan

2
使用Java中的String.replaceAll()方法。对于您的问题,replaceAll应该足够好了。

1
您可以按以下方式删除单个字符:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

输出:
919595354336

0
如果您只想在Java中进行字面替换,请使用Pattern.quote(string)将任何字符串转义为字面量。
myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

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