例如,
1、如何把下面代码,改为用正则表达式,只用一个replaceAll()来解决呢?"!@##$dslk4032ld--s23%$#^&^*&*(;--qqqq".replace("#", "#").replace("%", "%").replace(";",";").replace("--", "-").replace(" ", " ")2、如何只把exec或eXeC或ExeC和execute或ExEcuTe等等,全部替换为exec或execute,因为exec开头的英文单词还有不少,我也不想这两个命令以外的其他单词替换掉。

解决方案 »

  1.   

    第一个问题没什么高效的办法.自己写程序去char[]里找,然后替换可能还快点儿.
    第二个问题可以替换 "exec " 为 "exec ",后面都加个空格.然后正则有忽略大小写的方式,可能解决有些字符大写的问题.
      

  2.   

    还有一个:
    我想把textarea传入数据库的内容里面,重复的<p><p>。,全部替换成一个<p>。
    我的代码是这样的:
    System.out.println("abc<p><p><p>cd>>>>efpppkde<".replaceAll("[<p>]{2,}+", "<p>"));
    但结果是:abc<p>cd<p>ef<p>kde<。
    也就是说,重复的p和<,都被替换成<p>了。应该如何修改呢?
      

  3.   

    第一个问题,我很奇怪你需求,因为你的replacement是和前面的regex一一对应的,这样的话一个replaceAll应该是解决不了问题的.就你这样写其实已经是用到正则了,以下是String.replace的实现代码.    public String replace(CharSequence target, CharSequence replacement) {
            return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
                this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
        }
    第二个问题,有思路,也实现了,但是自己感觉写法上不太好,再想想吧,匹配思路是,
    开头(?i)exec非字母  或者  非字母(?i)exec非字母  或者 非字母(?i)exec结尾
    execute同理  
    没有找到java匹配一个单词的简单用法.第三个问题是因为你用到了[],[]其中的字符是或的关系,按你的写法意思是只要出现了多个<或>或p都会被替换.
    System.out.println("abc<p><p><p>cd>>>>efpppkde<".replaceAll("<p>(?=<p>)", ""));
    //我的思路是匹配<p>后面是否还有<p>,有的话将前面的<p>删掉.试过了应该没问题
      

  4.   


    str = "exec或eXeC或ExeC和execute或ExEcuTe等等Exece,全部替exec或execute";
    str = str.replaceAll("(?i)exec(?!\\w)","exec").replaceAll("(?i)execute(?!\\w+)","execute");
    System.out.println(str);str = "abc<p><p><p>cd>>>>efpppkde<";
    str = str.replaceAll("(<p>)\\1*","<p>");
    System.out.println(str);
      

  5.   

    第二个问题前后匹配边界行不行?\\b(?i)exec\\b
    \\b(?i)execute\\b
      

  6.   

    问题基本上都解决了,但因为刚接触正则,还有很多疑问。还想再问一个问题:
    Greedy 数量词 、Reluctant 数量词 、Possessive 数量词 是不是可以同时用?写法好像有些不同。
    会不会冲突?
      

  7.   

    对于<p>,我最终的写法是:(<p>){2,},原因只有一个,我比较容易看得明白。这个写法是综合了4楼家括号()和我自己原来的写法的。只是4楼的\\1*的写法,我在JAVAAPI说明书里面看不到。Greedy 数量词 
    X? X,一次或一次也没有 
    X* X,零次或多次 
    X+ X,一次或多次 
    X{n} X,恰好 n 次 
    X{n,} X,至少 n 次 
    X{n,m} X,至少 n 次,但是不超过 m 次 
      
    Reluctant 数量词 
    X?? X,一次或一次也没有 
    X*? X,零次或多次 
    X+? X,一次或多次 
    X{n}? X,恰好 n 次 
    X{n,}? X,至少 n 次 
    X{n,m}? X,至少 n 次,但是不超过 m 次 
      
    Possessive 数量词 
    X?+ X,一次或一次也没有 
    X*+ X,零次或多次 
    X++ X,一次或多次 
    X{n}+ X,恰好 n 次 
    X{n,}+ X,至少 n 次 
    X{n,m}+ X,至少 n 次,但是不超过 m 次 呵呵,请恕我愚钝,水平如此,只能按图索骥,对号入座。
      

  8.   

    在前面用了(<p>),表示将<p>作为一个group,而\\1*表示group(1)零或多个. ()就是分组,从左往右1-9组,最多就是group(9). 但是(?的用法不算分组.
    这个可以参见Matcher里面的group(int)方法.Greedy 和 Reluctant参考此帖34楼 火龙果大哥的回复不同的数量词应该可以在一个表达式中同时出现不冲突,因为每一个数量词都是对应它之前的字元,所以一个表达式中的不同字元用不同的数量词应该是不会冲突的,自己的理解,还没去验证过.