如果我有字符串:
var myStr = "foo_0_bar_0";
我想我们应该有一个名为getAndIncrementLastNumber(str)
所以,如果我这样做:
myStr = getAndIncrementLastNumber(str); // "foo_0_bar_1"
考虑到可能有另一个文本而不是foo
和bar
,可能没有underscores
或者可能有多个underscore
;
JavaScript
或jQuery
与.replace()
和RegEx
有什么办法吗?
答案 0 :(得分: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;
});
}
答案 1 :(得分: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;
});
}
答案 2 :(得分: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);
}
答案 3 :(得分:0)
试试这个:
function getAndIncrementLastNumber(str){
var myRe = /\d+[0-9]{0}$/g;
var myArray = myRe.exec(str);
return parseInt(myArray[0])+1;
}
答案 4 :(得分: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 removing '-' character from string这只是一个示例,但您会有一个想法。
答案 5 :(得分: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 :(得分:0)
@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');
});
});