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"、2つの文字のシーケンスを見つけることを意味します。最初の文字は文字または数字ではなく、その後に空白ではない文字が続きます。

あなたが意味するのはです"[^\w\s]"。つまり、文字でも数字でも空白でもない単一の文字を見つけます。("[\W\S]"これは、文字または数字ではない、または空白ではない文字を見つけることを意味するため、使用できません。これは、基本的にすべて印刷可能な文字です)。

2番目の正規表現は、予約文字をエスケープせずに使用しようとしているため、問題になります。ほとんどの文字(すべてではない)に特別な意味がない[]場所でそれらを囲むことができますが、全体が非常に乱雑に見えるため、句読点を見逃していないことを確認する必要があります。

例:

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++'

複数のスペースを1つにグループ化する場合は、代わりに正規表現として+使用"\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

次のような正規表現を使用できます。

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

式から最初と最後の「#」を削除します

よろしく

于 2013-01-25T17:55:31.780 に答える
0

@npinti

「\w」の使用は「\dA-Za-z」と同じです

これは私のために働いた:

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