现在要把字符串中连续出现2个a的替换成bb
如
admin => admin 不替换,只出现一次
aaadmin => aaadmin 不替换,a连续出现了3次
aadmin => bbdmin 替换了
aa2aa => bb2bb 替换了
如
admin => admin 不替换,只出现一次
aaadmin => aaadmin 不替换,a连续出现了3次
aadmin => bbdmin 替换了
aa2aa => bb2bb 替换了
aadminaaadminaaaadmin => bbdminaaadminaaaadmin 第一个a出现了2次,被替换了,后面的出现次数不是2,没有替换
public class Test
{
/**
* 使用正则表达式
* @param str
* @param val
*/
public static void placeByRegex(String str, String val)
{
String regex = "(?<!a)aa(?!a)";
String result = str.replaceAll(regex, val);
System.out.println(result);
}
/**
* 使用算法
* 具体思路是:
* 遍历每一个字符,当遇到a的时候,就while循环后面,看看有多少个a,如何后面只有一个,就把当前的和后面的一个替换掉
* 一直这样,知道循环完毕
* @param str
* @param a(把连续出现2个a的替换成成b)
* @param b
*/
static void placeByalgorithm(String str, char a, char b)
{
char[] arr = str.toCharArray();
char[] res = new char[arr.length];
int i = 0;
while(i < arr.length)
{
if(arr[i] == a)
{
int j = i + 1;
int count = 0;
while(j < arr.length && arr[j] == a)
{
j = j + 1;
count = count + 1;
}
if(count == 0)
{
//下一位,不是a
res[i] = arr[i];
i = i + 1 ;
}
else if(count == 1)
{
//仅仅只是下一位是a
res[i] = b;
res[i+1] = b;
i = i + 2;
}
else
{
//a的下面有多个a
for(int k=i;k<j;k++)
{
res[k] = arr[k];
}
i = i + count + 1;
}
}
else
{
res[i] = arr[i];
i = i + 1;
}
}
System.out.println(new String(res));
}
public static void main(String[] args)
{
String str = "adminaaad44aaaaaaa42sxaa0aa";
//str = "aaaa2aa4zzzaaaaa3aa";
System.out.println(str);
placeByRegex(str,"--");
placeByalgorithm(str,'a','-');
}
}