格式化模版字符串
用于输出或则日志使用
此方法只是简单将占位符 {} 按照顺序替换为参数
如果想输出 {} 使用 \转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\ 即可
例:
通常使用:format(“this is {} for {}”, “a”, “b”) -> this is a for b
转义{}: format(“this is \{} for {}”, “a”, “b”) -> this is {} for a
转义\: format(“this is \\{} for {}”, “a”, “b”) -> this is \a for b
public class StrFormatter
{
public static final String EMPTY_JSON = "{}";
public static final char C_BACKSLASH = '\\';
public static final char C_DELIM_START = '{';
public static final char C_DELIM_END = '}';
/**
* 格式化字符串<br>
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
* 例:<br>
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
*
* @param strPattern 字符串模板
* @param argArray 参数列表
* @return 结果
*/
public static String format(final String strPattern, final Object... argArray)
{
//判断是否为空
if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
{
return strPattern;
}
//模版字符串的长度
final int strPatternLength = strPattern.length();
// 初始化定义好的长度以获得更好的性能
StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
int handledPosition = 0;
int delimIndex;// 占位符所在位置
//遍历数组
for (int argIndex = 0; argIndex < argArray.length; argIndex++)
{
//寻找{}
delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
//没有{}的处理
if (delimIndex == -1)
{
//没有字符串没有{},所以直接返回
if (handledPosition == 0)
{
return strPattern;
}
else //没有{}要进行赋值了,
{ // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
sbuf.append(strPattern, handledPosition, strPatternLength);
return sbuf.toString();
}
}
else
{
//有{}可以进行填充
//判断前面是否有//
if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
{
if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
{
// 转义符之前还有一个转义符,占位符依旧有效
sbuf.append(strPattern, handledPosition, delimIndex - 1);
sbuf.append(argArray[argIndex]);
handledPosition = delimIndex + 2;
}
else
{
// 占位符被转义
argIndex--;
sbuf.append(strPattern, handledPosition, delimIndex - 1);
sbuf.append(C_DELIM_START);
handledPosition = delimIndex + 1;
}
}
else
{
// 正常占位符
sbuf.append(strPattern, handledPosition, delimIndex);
sbuf.append(argArray[argIndex]);
handledPosition = delimIndex + 2;
}
}
}
// 加入最后一个占位符后所有的字符
sbuf.append(strPattern, handledPosition, strPattern.length());
return sbuf.toString();
}
public static void main(String[] args) {
System.out.println(format("{}{}", "hello"));
//
//String str = "h{},b{}";
//System.out.println(str.indexOf("{}",2));
System.out.println("\\\\{{}{}".indexOf(EMPTY_JSON));
}
}