【问题标题】:Regex for special characters in javajava中特殊字符的正则表达式
【发布时间】:2012-05-18 20:16:52
【问题描述】:
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:

如何实现?我已经搜索过,但找不到完美的解决方案。

【问题讨论】:

    标签: java regex replace


    【解决方案1】:

    这对我有用:

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

    对于这个输入字符串:

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

    它产生了这个结果:

    +wetyk+678dfgh

    【讨论】:

    • @Archie.bpgc:很抱歉造成误解。以上应该可以工作。
    • @npinti:删除空格..[^... ]
    • @PrinceJohnWesley:如果我从[^\\dA-Za-z ] 中删除空格,它将捕获空格并将其替换为空字符串。如果我正确理解 OP,他/她想删除特殊字符并用加号替换空格。
    • @Archie.bpgc:很高兴它成功了。对最初的误解深表歉意。
    • 我只是想向我的朋友展示使用 replaceAll 是多么简单。他希望我使用 url 编码,再次非常感谢
    【解决方案2】:

    replaceAll 需要一个正则表达式:

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

    【讨论】:

    • sry 它给了我同样的错误:java.util.regex.PatternSyntaxException: 索引 34 附近的语法错误 U_REGEX_MISSING_CLOSE_BRACKET:
    • java.util.regex.PatternSyntaxException:索引 33 附近的未封闭字符类 [`~!@#$%^&*()_+[]\\;',./{}|: "?]
    • 也将 [ 转义,像这样 [`~!@#$%^&*()_+\\[\\]\\\\;\',./{}| :\"?]
    【解决方案3】:

    您的第一个正则表达式的问题在于,"\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+" 作为您的正则表达式(记得转义斜杠)。

    【讨论】:

      【解决方案4】:

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

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

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

      问候

      【讨论】:

        【解决方案5】:

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

        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
        

        【讨论】:

          【解决方案6】:

          @npinti

          使用“\w”与“\dA-Za-z”相同

          这对我有用:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多