4
public static final String specialChars1= "\\W\\S";
String str2 = str1.replaceAll(specialChars1, "").replace(" ", "+");

public static final String specialChars2 = "`~!@#$%^&*()_+[]\\;\',./{}|:\"<>?";
String str2 = str1.replaceAll(specialChars2, "").replace(" ", "+");

不管str1是什么,我都希望删除除字母和数字以外的所有字符,并将空格替换为加号 ( +)。

我的问题是,如果我使用specialChar1,它不会删除一些字符,如;, ', ",如果我使用specialChar2它会给我一个错误:

java.util.regex.PatternSyntaxException: Syntax error U_REGEX_MISSING_CLOSE_BRACKET near index 32:

这怎么可能实现?我已经搜索但找不到完美的解决方案。

4

6 回答 6

15

这对我有用:

String result = str.replaceAll("[^\\dA-Za-z ]", "").replaceAll("\\s+", "+");

对于此输入字符串:

/ -+!@#$%^& ())";:[]{}\ |wetyk 678dfgh

它产生了这个结果:

+wetyk+678dfgh

于 2012-05-10T09:24:49.327 回答
6

replaceAll需要一个正则表达式:

public static final String specialChars2 = "[`~!@#$%^&*()_+[\\]\\\\;\',./{}|:\"<>?]";
于 2012-05-10T09:25:11.827 回答
2

您的第一个正则表达式的问题在于,这"\W\S"意味着找到一个由两个字符组成的序列,其中第一个不是字母或数字,后跟一个不是空格的字符。

你的意思是"[^\w\s]"。这意味着:找到一个既不是字母也不是数字也不是空格的单个字符。(我们不能使用"[\W\S]",因为这意味着找到一个不是字母或数字或不是空格的字符——这基本上都是可打印的字符)。

第二个正则表达式是一个问题,因为您试图使用保留字符而不转义它们。您可以将它们包含在[]大多数字符(不是全部)没有特殊含义的地方,但整个事情看起来很混乱,您必须检查您是否错过了任何标点符号。

例子:

String sequence = "qwe 123 :@~ ";

String withoutSpecialChars = sequence.replaceAll("[^\\w\\s]", "");

String spacesAsPluses = withoutSpecialChars.replaceAll("\\s", "+");

System.out.println("without special chars: '"+withoutSpecialChars+ '\'');
System.out.println("spaces as pluses: '"+spacesAsPluses+'\'');

这输出:

without special chars: 'qwe 123  '
spaces as pluses: 'qwe+123++'

如果您想将多个空格组合为一个,请+改用"\s+"正则表达式(请记住转义斜杠)。

于 2012-05-10T09:47:29.863 回答
1

我有一个类似的问题要解决,我使用了以下方法:

text.replaceAll("\\p{Punct}+", "").replaceAll("\\s+", "+");

带有时间基准标记的代码

public static String cleanPunctuations(String text) {
    return text.replaceAll("\\p{Punct}+", "").replaceAll("\\s+", "+");
}

public static void test(String in){
    long t1 = System.currentTimeMillis();
    String out = cleanPunctuations(in);
    long t2 = System.currentTimeMillis();
    System.out.println("In=" + in + "\nOut="+ out + "\nTime=" + (t2 - t1)+ "ms");

}

public static void main(String[] args) {
    String s1 = "My text with 212354 digits spaces and \n newline \t tab " +
            "[`~!@#$%^&*()_+[\\\\]\\\\\\\\;\\',./{}|:\\\"<>?] special chars";
    test(s1);
    String s2 = "\"Sample Text=\"  with - minimal \t punctuation's";
    test(s2);
}

样本输出

In=My text with 212354 digits spaces and 
 newline     tab [`~!@#$%^&*()_+[\\]\\\\;\',./{}|:\"<>?] special chars
Out=My+text+with+212354+digits+spaces+and+newline+tab+special+chars
Time=4ms
In="Sample Text="  with - minimal    punctuation's
Out=Sample+Text+with+minimal+punctuations
Time=0ms
于 2013-12-26T07:39:18.567 回答
0

@npinti

使用 "\w" 与 "\dA-Za-z" 相同

这对我有用:

String result = str.replaceAll("[^\\w ]", "").replaceAll("\\s+", "+");
于 2015-04-24T19:01:21.990 回答
0

你可以使用这样的正则表达式:

[<#![CDATA[¢<(+|!$*);¬/¦,%_>?:#="~{@}\]]]#>]`

从表达式的开头和结尾删除“#”

问候

于 2013-01-25T17:55:31.780 回答