package tc.oc.commons.core.collection;
import java.util.function.UnaryOperator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Appends or increments a numeric suffix to a string e.g.
*
* {@code
* StringIncrementer si = new StringIncrementer("-", 1);
* si.apply("woot") // returns "woot-1"
* si.apply("woot-1") // returns "woot-2"
* si.apply("woot-27") // returns "woot-28"
* }
*/
public class StringIncrementer implements UnaryOperator<String> {
private final String delimiter;
private final int initial;
private final Pattern pattern;
public StringIncrementer(String delimiter) {
this(delimiter, 0);
}
public StringIncrementer(String delimiter, int initial) {
this.delimiter = delimiter;
this.initial = initial;
this.pattern = Pattern.compile("^(.*)" + Pattern.quote(delimiter) + "(\\d+)$");
}
@Override
public String apply(String s) {
final Matcher matcher = pattern.matcher(s);
if(matcher.matches()) {
return matcher.group(1) + delimiter + (Integer.parseInt(matcher.group(2)) + 1);
} else {
return s + delimiter + initial;
}
}
}