一、前言
针对包含数字的字符串剔除字母根据步长递增,字母保持不变,数字按照步长进行递增。
比如:
针对w001按照步长2增加3次,结果是:w001,w003,w005
二、源码
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@Slf4j
public class StrIncreaseDemo {
/**
* 包含数字的字符串剔除字母根据步长递增
*
* @param args
*/
public static void main(String[] args) {
String str = "a01";
int step = 3;
int total = 3;
List<String> list = increaseStr(str, total, step);
log.info("总数:{}", list.size());
for (String s : list) {
log.info("结果:{}", s);
}
}
/**
* @param str 字符串
* @param total 总数
* @param step 步长
* @return
*/
private static List<String> increaseStr(String str, int total, int step) {
List<String> list = new ArrayList<>();
String numStr = toInt(str);
if ("".equalsIgnoreCase(numStr)) {
return list;
}
int num = Integer.parseInt(numStr);
char[] chars = str.toCharArray();
int length = chars.length;
for (int j = 0; j < total; j++) {
//数字转成的字符串
StringBuilder sb = new StringBuilder(String.format("%0" + numStr.length() + "d", num));
StringBuilder a = new StringBuilder();
int digitFlag = 0;
//倒序遍历字符串
for (int i = length - 1; i >= 0; i--) {
//log.info("char:{}", chars[i]);
if (Character.isDigit(chars[i])) {
digitFlag++;
if (digitFlag == numStr.length()) {//找到的数字位数量等于数字长度,说明已经找完了->解决进位
a.insert(0, sb.toString());
} else {//将数字追到字符串前面
a.insert(0, sb.charAt(sb.length() - 1));
}
//去除最后一位
sb.setLength(sb.length() - 1);
} else {
a.insert(0, chars[i]);
}
}
// log.info("结果:{}", a.toString());
list.add(a.toString());
//字符串加上步长
num += step;
}
return list;
}
/**
* 正则提取字符串数字
*
* @param str
* @return
*/
public static String toInt(String str) {
String REGEX = "[^0-9]";
String intStr = Pattern.compile(REGEX).matcher(str).replaceAll("").trim();
log.info("数字:{}", intStr);
return intStr;
}
}
三、测试
INFO [main] - 数字:01
INFO [main] - 总数:3
INFO [main] - 结果:a01
INFO [main] - 结果:a04
INFO [main] - 结果:a07