Я работаю над проектом, который будет отслеживать файлы с автоматически сгенерированным номером. Однако мне нужно, чтобы пользователь мог указать формат этого числа. Например, если у меня есть строка формата file-000000#-v000a
, первая часть числа всегда должна иметь длину не менее 6 цифр, а вторая должна иметь длину не менее 3 цифр, дополненную слева нулями, например: file-000128-001
, но если у них больше или меньше 0, его следует соответствующим образом отрегулировать.
Я пытался придумать что-нибудь, используя функцию String.prototype.replace()
, но не знаю, как вычислить leftPadding
, чтобы это было правильное количество нулей.
Вот что я пробовал до сих пор:
let file_counter = 128;
let version_counter = 1;
// not sure how to calculate these numbers
let leftPadding = 6;
let leftPadding2 = 3;
const format = 'file-000000#-v000a';
const number = format
.replace(/0+#/, file_counter.toString().padStart(leftPadding, '0'))
.replace(/0+a/, version_counter.toString().padStart(leftPadding2, '0'));
console.info(number);
Мне нужно, чтобы он заканчивался другим символом (буквой или другим символом), потому что будет пара разных цифр, и пользователь должен иметь возможность выбрать, какое из них использовать.
С тех пор я нашел ответ на этот вопрос, так что если кто-то ищет что-то подобное, вот он:
const format = 'file-000000#-v000a';
const val1 = `${128}`;
const val2 = `${1}`;
let number = replaceValue(format, /0*#/g, val1);
number = replaceValue(number, /0*a/g, val2);
console.info(number);
function replaceValue(format, regex, value) {
const matches = [];
let m;
do {
m = regex.exec(format)
if (m)
matches.push({
str: m[0],
index: m.index
})
} while (m);
for (let match of matches) {
format = format.replace(match.str, value.padStart(match.str.length - 1, '0'));
}
return format;
}
Небольшое объяснение:
В функции replaceValue()
я нахожу все места, где встречается regex
, а затем просматриваю каждое из них и заменяю его предоставленным значением.
Это мое решение:
const format = "file-000000#-v000a",
val1 = `${128}`,
val2 = `${1}`;
const helper = (str, val, len) => str.replace(/0+/, val.padStart(len, "0"));
var parts = format.split("-");
parts[1] = helper(parts[1], val1, 6);
parts[2] = helper(parts[2], val2, 3);
var whole = parts.join("-");
console.info(whole);
Это хорошая идея, но я не могу полагаться на -
при разделении и объединении. Поскольку пользователь может указать любую строку формата, которую он хочет, она не всегда может содержать -
, разделяющие разные части.
Вы можете создать простую функцию, принимающую символ разделения в качестве аргумента.
А как быть в случае, когда символа разбиения нет? Если я разделю по каждому символу, то в итоге у меня будет фиксированная длина 0 с перед числами.
В этом случае (я предполагаю, что вы имеете в виду, например, «file000000#v000a») вам не нужно разбивать по каждому символу: просто используйте match
с регулярным выражением. Но это то, что вы можете сделать, даже если формат содержит символ разделения. regex101.com
Формат действительно не имеет смысла. Можете ли вы найти другой способ выразить это, например. просто
"000000"
?