Получить и заменить последнее число в строке на JavaScript или jQuery
если у меня есть строка:
var myStr = "foo_0_bar_0";
и я думаю, у нас должна быть функция под названием getAndIncrementLastNumber(str)
Итак, если я сделаю это:
myStr = getAndIncrementLastNumber(str); // "foo_0_bar_1"
принимая во внимание, что может быть другой текст вместо foo
и bar
а может и не быть underscores
или может быть более одного underscore
;
есть ли способ с JavaScript
или jQuery
С .replace()
и RegEx
?
7 ответов
вы можете использовать регулярное выражение /[0-9]+(?!.*[0-9])/
чтобы найти последнее число в строке (источник:http://frightanic.wordpress.com/2007/06/08/regex-match-last-occurrence/). Эта функция, используя это регулярное выражение с match (), parseInt () и replace (), должна делать то, что вам нужно:
function increment_last(v) {
return v.replace(/[0-9]+(?!.*[0-9])/, parseInt(v.match(/[0-9]+(?!.*[0-9])/), 10)+1);
}
вероятно, не очень эффективно, но для коротких строк это не должно иметь значения.
EDIT: вот немного лучший способ, используя функцию обратного вызова вместо поиска строка дважды:
function increment_last(v) {
return v.replace(/[0-9]+(?!.*[0-9])/, function(match) {
return parseInt(match, 10)+1;
});
}
вот как я делаю это:
function getAndIncrementLastNumber(str) {
return str.replace(/\d+$/, function(s) {
return ++s;
});
}
или же это особая благодарность Эрику:
function getAndIncrementLastNumber(str) {
return str.replace(/\d+$/, function(s) {
return +s+1;
});
}
попробуйте демо-версию, пожалуйста http://jsfiddle.net/STrR6/1/или http://jsfiddle.net/Mnsy3/
код
existingId = 'foo_0_bar_0';
newIdOnly = existingId.replace(/foo_0_bar_(\d+)/g, "");
alert(newIdOnly);
getAndIncrementLastNumber(existingId);
function getAndIncrementLastNumber(existingId){
alert(existingId);
newId = existingId.replace(/(\d+)/g, function(match, number) {
return parseInt(number) + 1;
});
alert(newId);
}
или
existingId = 'foo_0_bar_0';
newIdOnly = existingId.replace(/foo_0_bar_(\d+)/g, "");
alert(newIdOnly);
getAndIncrementLastNumber(existingId);
function getAndIncrementLastNumber(existingId){
alert(existingId);
newId = existingId.replace(/\d+$/g, function(number) {
return parseInt(number) + 1;
});
alert("New ID ==> " + newId);
}
будут ли числа разделены некоторыми символами? Что я понял от вас вопрос Ваша строка может выглядеть так 78_рас_0_798_fgssdflh__0_2323 !! Если это так, сначала вам нужно удалить все символы и подчеркивания всего за один раз. И тогда все, что вы сняли, вы можете заменить запятыми или чем-то еще.
таким образом, вы в основном будете иметь str1 выглядит следующим образом: 78_АМПУ_0_798_fgssdflh__0_2323 ; str2: 78,0,0,798,2323.
str2 не должен быть string либо вы можете просто сохранить их в массив переменных и получить максимальное число и увеличить его.
мой следующий вопрос: достаточно ли этого вашей проблемы? Если вам нужно заменить наибольшее число на это увеличенное число, вам нужно заменить появление этого числа в str1 и заменить его своим результатом.
надеюсь, что это помогает. Для замены с помощью jquery вы, вероятно, можете заглянуть в jQuery удаление символа ' - ' из строки это просто но у вас будет идея.
на выражение попробуйте это:
function getAndIncrementLastNumber(str){
var myRe = /\d+[0-9]{0}$/g;
var myArray = myRe.exec(str);
return parseInt(myArray[0])+1;
}
Если вы хотите получить только последнее число строки, Вот хороший способ с помощью parseInt ()
if(Stringname.substr(-3)==parseInt(Stringname.substr(-3)))
var b=Stringname.substr(-3);
else if(Stringname.substr(-2)==parseInt(Stringname.substr(-2)))
var b=Stringname.substr(-2);
else
var b=Stringname.substr(-1);
он проверяет и дает правильный ответ и сохраняет его в переменной b для 1-значного числа и до 3-значного числа. Вы можете сделать это для любого, если у вас есть логика
@Brilliant прав, +1, я просто хотел предоставить версию своего ответа с 2 модификациями:
- удалить ненужные
negative look-ahead
оператора. - добавить возможность добавить номер в конце, в случае, если он не существует.
``
/**
* Increments the last integer number in the string. Optionally adds a number to it
* @param {string} str The string
* @param {boolean} addIfNoNumber Whether or not it should add a number in case the provided string has no number at the end
*/
function incrementLast(str, addIfNoNumber) {
if (str === null || str === undefined) throw Error('Argument \'str\' should be null or undefined');
const regex = /[0-9]+$/;
if (str.match(regex)) {
return str.replace(regex, (match) => {
return parseInt(match, 10) + 1;
});
}
return addIfNoNumber ? str + 1 : str;
}
тесты:
describe('incrementLast', () => {
it('When 0', () => {
assert.equal(incrementLast('something0'), 'something1');
});
it('When number with one digit', () => {
assert.equal(incrementLast('something9'), 'something10');
});
it('When big number', () => {
assert.equal(incrementLast('something9999'), 'something10000');
});
it('When number in the number', () => {
assert.equal(incrementLast('1some2thing9999'), '1some2thing10000');
});
it('When no number', () => {
assert.equal(incrementLast('1some2thing'), '1some2thing');
});
it('When no number padding addIfNoNumber', () => {
assert.equal(incrementLast('1some2thing', true), '1some2thing1');
});
});