原始String如下:
C_CURRENCY3 LIKE '%' AND C_AC_NUMBER LIKE '%%' OR ACC_TP_CD LIKE '%CA%' AND ACC_SH_NM LIKE '%%%%' AND ACC_BK_NM_3RD LIKE % AND ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'
现在要匹配 ‘%’‘%%’ ‘%%%’‘%%%%’出现一个或多个 替换成 ‘%’
还要匹配 % %% %%% %%% %出现一个或多个  替换成 ‘%’ 这里的% 是不带单引号的,所以要完全匹配,不然肯定会把带单引号的也匹配进来。跪求正则

解决方案 »

  1.   

    就你的String来说,用(?<=\s)\'?\%+\'?(?=\s)即可,毕竟你的表达式的引号都是成对的
      

  2.   

    C_CURRENCY LIKE '%%%' AND C_AC_NUMBER  LIKE '%%%' AND ACC_TP_CD LIKE '%%%' AND ACC_SH_NM  LIKE '%%%' AND ACC_BK_NM_3RD LIKE '%%%' AND ACC_STAT_CD LIKE '%%%' AND CUST_BOS_ID= 'CSCMP' AND (BK_CMPT_ID >= % AND BK_CMPT_ID <= %) AND (D_TRXS_DATE >=% AND D_TRXS_DATE <= %)
    这个行不通
      

  3.   

    LZ说的没看明白,举个明显一点的例子,比如
    String original = "......";
    String expected = "XXXXXX";
      

  4.   

    String original = "'%' '%%' '%%%' '%%%%' '%%%%%' % %% %%% %%%% %%%%%";String expected = "'%' '%' '%' '%' '%' '%' '%' '%' '%' '%' '%'";
      

  5.   

    测试String如下:
    "C_CURRENCY LIKE '%%' AND C_AC_NUMBER  LIKE '%%%' AND ACC_TP_CD LIKE '%%%' AND ACC_SH_NM  LIKE '%%%' AND ACC_BK_NM_3RD LIKE '%%%' AND ACC_STAT_CD LIKE '%%%' AND CUST_BOS_ID= 'CSCMP' AND BK_CMPT_ID >= %%%% AND BK_CMPT_ID <= % AND D_TRXS_DATE >=% AND D_TRXS_DATE <= %%"最后一个的  %% 被替换成了  '%'%
      

  6.   


    public static void main(String[] args) {
    String str = "'%' '%%' '%%%' '%%%%' '%%%%%' % %% %%% %%%% %%%%%";
    str = str.replaceAll("'?%+'?","'%'");
    System.out.println(str);//'%' '%' '%' '%' '%' '%' '%' '%' '%' '%'
    }
      

  7.   

    我换成这个就好了 String reg = "(?<=\\W)\'?\\%+\\'?(?<=\\W)"
      

  8.   

    更没看明白,original有10组,expected有11个
      

  9.   

    一句正则貌似很难搞,即使写出来,效率怕是也不高。一定要一句replaceAll?ps,\'%%%\'应该变成'\'%\''pps,话说如果你是JDBC的话,直接用preparedStatement的话,不需要这么复杂吧
      

  10.   

    没有吧?应该能匹配吧不过最完善的表达式应该是
    (?<=[^\'%\w])(\'?)%+\1(?=[^\'%\w])
    这样'%%% 这种单边引号就不会被匹配了
      

  11.   


    public class Test{
    public static void main(String[] args){
    String content = "C_CURRENCY3 LIKE '%' AND C_AC_NUMBER LIKE '%%' OR ACC_TP_CD LIKE '%CA%' AND ACC_SH_NM LIKE '%%%%' AND ACC_BK_NM_3RD LIKE % AND ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'";
    String regex = "('?)(?<!\\w)%+(?!\\w)(\\1)";
    String replacement = "'%'"; content = content.replaceAll(regex,replacement); System.out.println(content);
    }
    }用这个就可以
      

  12.   


     String s = "C_CURRENCY3 LIKE '%' AND C_AC_NUMBER LIKE '%%' OR ACC_TP_CD " +
      "LIKE '%CA%' AND ACC_SH_NM LIKE '%%%%' AND ACC_BK_NM_3RD LIKE % AND ACC_STAT_CD LIKE " +
      "'%' AND CUST_BOS_ID= 'C000001'";
     s = s.replaceAll("\\%{2,}", "%");
     System.out.println(s);
    结果:
    C_CURRENCY3 LIKE '%' AND C_AC_NUMBER LIKE '%' OR ACC_TP_CD LIKE '%CA%' AND ACC_SH_NM LIKE '%' AND ACC_BK_NM_3RD LIKE % AND ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'
      

  13.   

    楼上正解,照LZ描述,管它有没有引号,反正只是连续的N个%,匹配了然后替换成1个不就行了。
      

  14.   

    String rdx="'%+'|%+";
    试试这个
      

  15.   


    需求一,所有连续的%都必须合并成一个
    需求二,单个的%必须在单引号之间我对需求理解对了么?public static void test()
    {
    String str = "'%' '%%' '%%%' '%CA%' '%%%%%' % %% %%% %%%% %%%%%";
    str = str.replaceAll("(?:\\s)(%+)", "'$1'").replaceAll("%{2,}", "%");
    System.out.println(str);// '%' '%' '%' '%' '%' '%' '%' '%' '%' '%'
    }两次replaceAll, 第一次加单引号,第二次连续%合并.
      

  16.   


    public static void test()
    {
    String str = "'%' '%%' '%%%' '%CA%' '%%%%%' % %% %%% %%%% %%%%%";
    str = str.replaceAll("'%{2,}'|%{2,}+", "'%'");
    System.out.println(str);// '%' '%' '%' '%CA%' '%' % '%' '%' '%' '%'
    }
    29楼这个用一个或貌似也可以,都试试吧
      

  17.   

    string pattern=@"(?<=\W)\'?\%+\'?(?=\W)";
      

  18.   


    题目要求 %%%%% 会变成 '%' ,多个 %换成一个并不能实现这个啊。
    用下面的正则可以public class Test{
        public static void main(String[] args){
            String content = "C_CURRENCY3 LIKE '%' AND C_AC_NUMBER LIKE '%%' OR ACC_TP_CD LIKE '%CA%' AND ACC_SH_NM LIKE '%%%%' AND ACC_BK_NM_3RD LIKE % AND ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'";
            String regex = "('?)(?<!\\w)%+(?!\\w)(\\1)";
            String replacement = "'%'";        content = content.replaceAll(regex,replacement);        System.out.println(content);
        }
    }
      

  19.   

    String str = "C_CURRENCY3 LIKE '%' AND C_AC_NUMBER LIKE '%%' OR ACC_TP_CD LIKE '%CA%' AND ACC_SH_NM LIKE '%%%%' AND ACC_BK_NM_3RD LIKE % AND ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'";
    String str2 = str.replaceAll("(%+)|([']%+['])","'%'");
    System.out.print(str2);
    结果:C_CURRENCY3 LIKE '%' AND C_AC_NUMBER LIKE '%' OR ACC_TP_CD LIKE ''%'CA'%'' AND ACC_SH_NM LIKE '%' AND ACC_BK_NM_3RD LIKE '%' AND ACC_STAT_CD LIKE '%' AND CUST_BOS_ID= 'C000001'
    不知符合要求不?
      

  20.   

    我有个疑问,要是%%CA%%该怎么处理,我理解为是'%CA%'
    要是按照('?)(?<!\\w)%+(?!\\w)(\\1)这样子replace的话会输出''%'%CA%'%''这样的结果
    我感觉可以参照Matcher的appendReplacement()单独写一个匹配的方法,同步将'%+和%+'替换为'%和%'
      

  21.   


    String s1="2%%hello%java%%%word";
    Pattern p = Pattern.compile("%{2,}");
    Matcher m = p.matcher(s1);
    String s2= m.replaceAll("%");