原始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'
现在要匹配 ‘%’‘%%’ ‘%%%’‘%%%%’出现一个或多个 替换成 ‘%’
还要匹配 % %% %%% %%% %出现一个或多个 替换成 ‘%’ 这里的% 是不带单引号的,所以要完全匹配,不然肯定会把带单引号的也匹配进来。跪求正则
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 original = "......";
String expected = "XXXXXX";
"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 <= %%"最后一个的 %% 被替换成了 '%'%
public static void main(String[] args) {
String str = "'%' '%%' '%%%' '%%%%' '%%%%%' % %% %%% %%%% %%%%%";
str = str.replaceAll("'?%+'?","'%'");
System.out.println(str);//'%' '%' '%' '%' '%' '%' '%' '%' '%' '%'
}
(?<=[^\'%\w])(\'?)%+\1(?=[^\'%\w])
这样'%%% 这种单边引号就不会被匹配了
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);
}
}用这个就可以
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'
试试这个
需求一,所有连续的%都必须合并成一个
需求二,单个的%必须在单引号之间我对需求理解对了么?public static void test()
{
String str = "'%' '%%' '%%%' '%CA%' '%%%%%' % %% %%% %%%% %%%%%";
str = str.replaceAll("(?:\\s)(%+)", "'$1'").replaceAll("%{2,}", "%");
System.out.println(str);// '%' '%' '%' '%' '%' '%' '%' '%' '%' '%'
}两次replaceAll, 第一次加单引号,第二次连续%合并.
public static void test()
{
String str = "'%' '%%' '%%%' '%CA%' '%%%%%' % %% %%% %%%% %%%%%";
str = str.replaceAll("'%{2,}'|%{2,}+", "'%'");
System.out.println(str);// '%' '%' '%' '%CA%' '%' % '%' '%' '%' '%'
}
29楼这个用一个或貌似也可以,都试试吧
题目要求 %%%%% 会变成 '%' ,多个 %换成一个并不能实现这个啊。
用下面的正则可以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);
}
}
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'
不知符合要求不?
要是按照('?)(?<!\\w)%+(?!\\w)(\\1)这样子replace的话会输出''%'%CA%'%''这样的结果
我感觉可以参照Matcher的appendReplacement()单独写一个匹配的方法,同步将'%+和%+'替换为'%和%'
String s1="2%%hello%java%%%word";
Pattern p = Pattern.compile("%{2,}");
Matcher m = p.matcher(s1);
String s2= m.replaceAll("%");