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


90

我要删除特殊字符,例如:

- + ^ . : ,

使用Java从String中获取。


您显然已经知道,根据您对问题的标记方式,正则表达式是什么。您是否尝试阅读该String课程的文档?特别要注意“ regex”一词;有一些方法,一些想法应该告诉您如何进行... :)
Karl Knechtel

3
这样的“特殊字符”一词被过度使用,几乎完全没有意义。如果您的意思是“我有要删除的特定字符列表”,则按照Thomas的建议进行操作,并使用正则表达式字符类将replaceAll其形成样式,然后将它们删除。如果您有更深奥的要求,请编辑问题。:)
Ray Toal

1
这些不是特殊字符...这些是:äâêíìéè,因为它们不是您常见的1字节字符类型,例如-+ ^是...无论如何,正如Ray所说,要么replaceAll为它们做一个,要么对它们进行解析字符串,将不是您想要取出的字符的字符添加到另一个字符串中,最后对要返回的字符串执行+ =。
贡萨洛维埃拉

deleteChars.apply( fromString, "-+^.:," );在此处找到deleteChars
Kaplan,

Answers:


255

这取决于您定义为特殊字符的内容,但是请尝试replaceAll(...)

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

请注意,该^字符不能是列表中的第一个字符,因为您要么必须对其进行转义,否则将意味着“除这些字符外的任何字符”。

另一个注意事项:-字符必须是列表中的第一个或最后一个,否则您必须对其进行转义,否则它将定义一个范围(例如:-,,表示“范围:为to的所有字符” ,)。

所以,为了保持一致性,而不是依赖于角色定位,你可能想逃避所有那些在正则表达式特殊含义的字符(下面的列表并不完整,所以要注意的其他人物像({$ 等等) :

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


如果要摆脱所有标点和符号,请尝试以下正则表达式:(\p{P}\p{S}请注意,在Java字符串中,您必须转义反斜杠:)"\\p{P}\\p{S}"

如果您可以精确定义应该在字符串中保留的内容,则第三种方法可能是这样的:

String  result = yourString.replaceAll("[^\\w\\s]","");

这意味着:替换所有不是单词字符(在任何情况下均为az,0-9或_)或空格的内容。

编辑:请注意,还有其他两种模式可能会有所帮助。但是,我无法全部解释它们,因此请查看regular-expressions.info的参考部分。

如Ray所建议的,这是“定义允许的字符”方法的限制性较小的替代方法:

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

正则表达式匹配所有不是任何语言的字母和分隔符(空格,换行符等)的所有内容。请注意,您不能使用[\P{L}\P{Z}](大写P表示不具有该属性),因为那意味着“不是字母或不是空格的所有内容”,几乎所有内容都匹配,因为字母不是空格,反之亦然。

有关Unicode的其他信息

某些unicode字符似乎由于不同的编码方式(例如单个代码点或代码点的组合)而引起问题。有关更多信息,请参考regular-expressions.info


+1是最佳的通用解决方案。因为你是上市在没有从OP细节一对夫妇的变化,你可能也表明,解释像模式[\P{L}]
雷特里

另请注意,该-字符必须是列表中的第一个或最后一个,否则需要转义。
kapex 2011年

[^\\p{L}\\p{Z}]似乎也消除了德国的Umlauts(ä,ö,ü)(至少对我来说是这样的:/),因此“正则表达式匹配所有不是任何语言的字母的东西”似乎不是100%正确的
彼得

@Peter不会消除我测试中的那些字符。您的情况可能还有另一个问题,例如,文本的编码不同。我将添加更多信息的链接。
托马斯

1
@ThomasString result = yourString.replaceAll("[^\w\s]","");犯了错Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth


18

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

模式是编译的正则表达式。在许多情况下,最好使用String.matchesString.replaceAll和这样的便捷方法String.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

这将删除阿拉伯字符
S0haib Nasir

15

尝试该类的replaceAll()方法String

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

public String replaceAll(String regex,
                         String replacement)

例:

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

它应该删除您要删除的所有{'^','+','-'}字符!


6

删除特殊字符

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

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

输出将是: abdd.

这很完美。


1
将获得字符串文字中的非法转义字符
John Joe,

如果要保留空格,还将删除空格,然后使用t2 = t2.replaceAll(“ [^ \\ w \\ s]”,“”);
Isuru Dilshan


1

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

String str="+919595354336";

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

 System.out.println(result);

输出:

919595354336

0

如果只想在java中进行文字替换,请使用Pattern.quote(string)将所有字符串转义为文字。

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.