Вопрос по javascript, regex, replace, jquery – Получить и заменить последнее число в строке с помощью JavaScript или jQuery

9

Если у меня есть строка:

var myStr = "foo_0_bar_0";

и я думаю, у нас должна быть функция с именемgetAndIncrementLastNumber(str)

так что если я сделаю это:

myStr = getAndIncrementLastNumber(str); // "foo_0_bar_1"

Принимая во внимание, что может быть другой текст вместоfoo а такжеbar и там не может бытьunderscores  или может быть более одногоunderscore;

Есть ли способ сJavaScript или жеjQuery с.replace() и немногоRegEx?

Что делать, если последний номер9? Может ли ваш LastNumber содержать более 1 цифры? Fabrício Matté
Да, этот последний номер может содержать более 1 цифры. Mr_Nizzle

Ваш Ответ

7   ответов
16

/[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);
}

Вероятно, не очень эффективный, но для коротких строк это не имеет значения.

РЕДАКТИРОВАТЬ: Вот несколько лучший способ, используя функцию обратного вызова вместо поиска строки дважды:

function increment_last(v) {
    return v.replace(/[0-9]+(?!.*[0-9])/, function(match) {
        return parseInt(match, 10)+1;
    });
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededfoo_0_bar_0Error: User Rate Limit Exceededfoo_1_bar_0Error: User Rate Limit Exceeded Mr_Nizzle
Error: User Rate Limit Exceeded Mr_Nizzle
Error: User Rate Limit Exceeded10Error: User Rate Limit ExceededparseInt()Error: User Rate Limit Exceeded10Error: User Rate Limit Exceededreplace()Error: User Rate Limit Exceeded
0

вот хороший способ использования 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-значного числа. Вы можете сделать это любому, если у вас есть логика

6

function getAndIncrementLastNumber(str) {
    return str.replace(/\d+$/, function(s) {
        return ++s;
    });
}

Fiddle

Или также это, отдельная благодарность Эрику:

function getAndIncrementLastNumber(str) {
    return str.replace(/\d+$/, function(s) {
        return +s+1;
    });
}

Fiddle

Error: User Rate Limit ExceededparseIntError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
s+1Error: User Rate Limit Exceededs++
Error: User Rate Limit Exceeded=]
Error: User Rate Limit Exceededarticle_themes_attributes_0_theme_urls_attributes_0_urlError: User Rate Limit Exceededattributes_Error: User Rate Limit Exceeded_urlError: User Rate Limit Exceeded Mr_Nizzle
0

из вашего вопроса, ваша строка может выглядеть следующим образом 78_asd_0_798_fgssdflh__0_2323 !! Если это так, то сначала вам нужно удалить все символы и подчеркивания всего за один раз. И затем все, что вы удалили, вы можете заменить запятой или чем-то еще.

Таким образом, вы будете в основном иметь str1: 78_asd_0_798_fgssdflh__0_2323; стр.2: 78,0,0,798,2323.

str2 не обязательно должен быть строкой, вы можете просто сохранить их в массив переменных, получить максимальное число и увеличить его.

Мой следующий вопрос: достаточно ли это вашей проблемы? Если вам нужно заменить наибольшее число на это увеличенное число, то вам нужно заменить вхождение этого числа в str1 и заменить его своим результатом.

Надеюсь это поможет. Для замены с помощью jquery, вы, вероятно, можете посмотреть вJQuery удаление "-" символ из строки это всего лишь пример, но у вас будет идея.

0

regex попробуй это:

function getAndIncrementLastNumber(str){
   var myRe = /\d+[0-9]{0}$/g;  
   var myArray = myRe.exec(str);
   return parseInt(myArray[0])+1;​
}

демо:http://jsfiddle.net/F9ssP/1/

Error: User Rate Limit ExceededreplaceError: User Rate Limit Exceeded Mr_Nizzle
0

+1, я просто хотел предоставить версию его ответа с двумя изменениями:

Remove the unnecessary negative look-ahead operator. Add the ability to add a number in the end, in case it doesn't exist.

```

/**
 * 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;
}

Tests:

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');
        });
    });
1

try this demo please http://jsfiddle.net/STrR6/1/ or http://jsfiddle.net/Mnsy3/

code

existingId = 'foo_0_bar_0';
newIdOnly = existingId.replace(/foo_0_bar_(\d+)/g, "$1");
alert(newIdOnly);

getAndIncrementLastNumber(existingId);

function getAndIncrementLastNumber(existingId){
    alert(existingId);
newId = existingId.replace(/(\d+)/g, function(match, number) {
    return parseInt(number) + 1;
});
alert(newId);
}
​

or

   existingId = 'foo_0_bar_0';
newIdOnly = existingId.replace(/foo_0_bar_(\d+)/g, "$1");
alert(newIdOnly);

getAndIncrementLastNumber(existingId);

function getAndIncrementLastNumber(existingId){
    alert(existingId);
    newId = existingId.replace(/\d+$/g, function(number) {
    return parseInt(number) + 1;
});
alert("New ID ==> " + newId);
}
​
Error: User Rate Limit ExceededfooError: User Rate Limit Exceeded Mr_Nizzle
Error: User Rate Limit Exceededfoo_1_bar_1Error: User Rate Limit Exceededfoo_0_bar_1Error: User Rate Limit Exceeded Mr_Nizzle
Error: User Rate Limit ExceededexistingId = 'foo_0_bar_0';Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededjsfiddle.net/Mnsy3/10Error: User Rate Limit Exceeded

Похожие вопросы