У меня есть строка вроде:
MPG_0023
Я хочу найти что-то вроде
MPG_0023 + 1
и я должен получить
MPG_0024
Как это сделать в JavaScript? Следует позаботиться о том, чтобы, если нет ведущих нулей или один ведущий ноль все равно должен работать, как MPG23 должен давать MPG24 или MPG023 должен давать MPG024.
Не должно быть предположения, что есть подчеркивание или ведущие нули, единственное, что первая часть - это любая строка или даже не строка, а числовая часть может иметь или не иметь ведущие нули, и это любой вид числа, поэтому он должен работать для 0023 (возврат 0024) или для gp031 (возврат gp032) и т. д.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете преобразовать в число, увеличить значение и вернуть обратно. Затем проверьте, нужны ли вам ведущие нули, посмотрев на длину строки.
Фрагмент ниже:
let str = "MPG_0023",
num = Number(str.substr(4)) + 1,
newStr = String(num);
function addLeading0(str) {
return str.length === 2 ? '00' + str : (str.length === 3 ? '0' + str : str);
}
console.info("MPG_" + addLeading0(newStr));Используя регулярное выражение, вы можете сделать это так.
var text1 = 'MPG_0023';
var text2 = 'MPG_23';
var regex = /(.*_[0]*)(\d*)/;
var match1 = regex.exec(text1);
var match2 = regex.exec(text2);
var newText1 = match1[1] + (Number(match1[2]) + 1);
var newText2 = match2[1] + (Number(match2[2]) + 1);
console.info(newText1);
console.info(newText2);
Вот быстрый способ без использования регулярных выражений ... пока перед числом всегда стоит одно подчеркивание и пока число состоит из 4 цифр, это будет работать.
var n = 'MPG_0023';
var a = n.split('_');
var r = a[0]+'_'+(("0000"+(++a[1])).substr(-4));
console.info(r);Или, если вы действительно хотите использовать регулярное выражение, подчеркивание не имеет значения.
var n = "MPG_0099";
var r = n.replace(/(\d+)/, (match)=>("0".repeat(4)+(++match)).substr(-4));
console.info(r);Использование регулярного выражения вместе с функцией padStart
function add(str, n) {
return str.replace(/(\d+)/, function(match) {
var length = match.length;
var newValue = Number(match) + n;
return newValue.toString(10).padStart(length, "0");
});
}
console.info(add("MPG_023", 101));
console.info(add("MPG_0023", 101));
console.info(add("MPG_0000023", 10001));
console.info(add("MPG_0100023", 10001));да, я видел это, просто подумал, что это хороший ответ, и вы можете исправить его вместо того, чтобы просто добавить примечание о том, что ваше решение не работает. "MPG_0099".replace(/(\d+)/, (match)=>("0".repeat(4)+(++match)).substr(-4)); - это то, что я бы сделал, но поскольку вы полностью изменили свой ответ, я просто добавлю это к своему ответу.
@ Occam'sRazor, ты прав, потому что я обновил ответ!
Инкремент и подушечка одинаковое значение (комментарии встроенные)
var prefix = "MPG_"
var padDigit = 4; //number of total characters after prefix
var value = "MPG_0023";
console.info("currentValue ", value);
//method for padding
var fnPad = (str, padDigit) => (Array(padDigit + 1).join("0") + str).slice(-padDigit);
//method to get next value
var fnGetNextCounterValue = (value) => {
var num = value.substring(prefix.length); //extract num value
++num; //increment value
return prefix + fnPad(num, padDigit); //prepend prefix after padding
};
console.info( "Next", value = fnGetNextCounterValue(value) );
console.info( "Next", value = fnGetNextCounterValue(value) );
console.info( "Next", value = fnGetNextCounterValue(value) );Один из способов - разделить строку на символ «_», увеличить число, а затем снова добавить нули к числу.
var testString = "MGP_0023";
var ary = testString.split("_");
var newNumber = Number(ary[1]) + 1;
var result = ary[0] + pad(newNumber);
// helper function to add zeros in front of the number
function pad(number) {
var str = number.toString();
while (str.length < 4) {
str = '0' + str;
}
return str;
}
Вы можете использовать регулярные выражения для внесения изменений, как показано в следующем коде.
var text = "MPG_0023";
var getPart = text.replace ( /[^\d.]/g, '' ); // returns 0023
var num = parseInt(getPart); // returns 23
var newVal = num+1; // returns 24
var reg = new RegExp(num); // create dynamic regexp
var newstring = text.replace ( reg, newVal ); // returns MPG_0024
console.info(num);
console.info(newVal);
console.info(reg);
console.info(newstring);Этот ответ идеален, другие ответы могут сломаться для некоторых строк, Спасибо, Синха!
Если вы начнете с «MPG_0099», вы получите «MPG_00100», поэтому я бы не сказал, что это правильно. У вас должно получиться "MPG_0100"
@FrodmanG, да, вы правы. Но это было требованием в исходном вопросе.
MPG_0099 возвращает MPG_00100 .., вероятно, должен возвращать MPG_0100