private String doReplacement(String str, int startIndex, LinkedList<Object> parameters) {
        if (parameters == null || parameters.isEmpty()) {
            return str;
        }
        
        final int length = str.length();
        for (int index = startIndex; index < length; index++) {
            int persentIndex = 0;
            if (str.charAt(index) == PERSENT) {
                persentIndex = index;
            } else continue;
            
            if (persentIndex != -1 && persentIndex != length - 1) {
                char nextChar = str.charAt(persentIndex + 1);
                if (supports.contains(nextChar)) {
                    Object firstObject = parameters.getFirst();
                    String firstParameter = (firstObject != null) ? firstObject.toString() : NULL;
                    String formattedString = StringUtils.replaceOnce(str, str.substring(persentIndex, persentIndex + 2), firstParameter);
                    parameters.removeFirst();
                    int newStartIndex = persentIndex + firstParameter.length();
                    return doReplacement(formattedString, newStartIndex, parameters);
                }
            }
        }
        return str;
    }