10

如果我有字符串:

var myStr = "foo_0_bar_0";

我想我们应该有一个名为getAndIncrementLastNumber(str)

所以如果我这样做:

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

考虑到可能有另一个文本而不是fooandbar并且可能没有underscores 或可能不止一个underscore

有什么办法 with JavaScriptor jQuerywith .replace()and someRegEx吗?

4

7 回答 7

17

您可以使用正则表达式/[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;
    });
}
于 2012-06-15T22:52:54.813 回答
7

这是我的做法:

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

小提琴

或者这个,特别感谢 Eric:

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

小提琴

于 2012-06-15T22:56:38.490 回答
1

请尝试此演示 http://jsfiddle.net/STrR6/1/ http://jsfiddle.net/Mnsy3/

代码

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);
}
​

或者

   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);
}
​
于 2012-06-15T22:57:52.183 回答
1

@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');
        });
    });
于 2017-05-22T23:14:46.820 回答
0

正则表达式中试试这个:

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/

于 2012-06-15T22:52:58.947 回答
0

数字会用一些字符分隔吗?我从你的问题中了解到的是你的字符串可能看起来像这样 78_asd_0_798_fgssdflh__0_2323 !如果是这种情况,首先您需要一次性删除所有字符和下划线。然后无论你删除了什么,你都可以用逗号或其他东西替换。

所以你基本上会有 str1: 78_asd_0_798_fgssdflh__0_2323 ; str2:78,0,0,798,2323。

str2 不必是字符串,您可以将它们保存到变量数组中并获取最大数量并增加它。

我的下一个问题是这足以解决您的问题吗?如果您必须用这个递增的数字替换最大的数字,那么您必须替换这个数字在 str1 中的出现并将其替换为您的结果。

希望这可以帮助。对于使用 jquery 进行替换,您可能可以查看JQuery 从字符串中删除“-”字符,这只是一个示例,但您会有一个想法。

于 2012-06-15T22:59:18.320 回答
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 位数字。如果你有逻辑,你可以做到任何

于 2013-09-19T08:53:32.383 回答