如何使用Javascript或Jquery在字符串中递增数字

12

我的文本域的ID是字符串且格式如下:

id='fisher[27].man'

我想要克隆这个文本域并增加数字,将ID更改为fisher[28].man,并将其添加到原有的文本域前面。

请问有没有使用jQuery轻松完成此操作的方法?

var existingId = $("#at textarea:last").attr('id');
var newCloned = lastTextArea.clone();
var newId = newCloned.attr('id');
//add the index number after spliting
//prepend the new one to 
newCloned.prepend("<tr><td>" + newCloned + "</td></tr>");

有更简单的方法可以克隆、获取索引号、拆分和添加前缀。

我也尝试过使用正则表达式来完成这个任务。

var existingIdNumber = parseInt(/fisher[(\d+)]/.exec(s)[1], 10);

有人能帮我吗?

6个回答

19

正确的正则表达式应该是这个

/fisher\[\d+\].man/

以下是一种方法,可以提取出id。

id = text.replace(/fisher\[(\d+)\].man+/g,"$1");
//Now do whatever you want with the id

同样地,可以使用相同的替换技术来获取递增的ID:

existingId = 'fisher[27].man';
newId = existingId .replace(/(\d+)+/g, function(match, number) {
       return parseInt(number)+1;
});
console.log(newId);

同时展示用法的演示


@vol7ron,感谢您的建议,希望您会喜欢这次修改。 - Starx
太棒了,我删除了我的评论 :) - vol7ron
@Starx,感谢您的出色回答。我的问题是是否有可能递增数字,除了带有特殊字符的数字,例如existingId = 'fisher[27][ $27].man'; 我只想递增[27],而不是[$27]。问候Jan - JanZitniak
@JanZitniak 一种方法是这个 - Starx

3

jsFiddle演示

不需要冗余代码。更改此行:

var newId = newCloned.attr('id');

致:

var newId  = newCloned.attr('id').replace( /(\d+)/, function(){return arguments[1]*1+1} );

3

这个来自这个问题的被采纳答案的另一个简单解决方案:

'url1'.replace(/\d+$/, function(n){ return ++n }); // "url2"
'url54'.replace(/\d+$/, function(n){ return ++n }); // "url55"

非常干净易读。

1
为了完全解决原帖中的请求,需要从正则表达式中删除 $,这样数字就不需要出现在字符串的末尾。 - rodamn

2

我很惊讶这么简单的事情居然没有好的实现。所有的例子都忽略了数字前有零的情况。下面的代码应该可以解决这个问题。

// 'item001' => 'item002'
function increment_alphanumeric_str(str){
    var numeric = str.match(/\d+$/)[0];
    var prefix = str.split(numeric)[0];

    function increment_string_num(str){
        var inc = String(parseInt(str)+1);
        return str.slice(0, str.length-inc.length)+inc;
    }

    return prefix+increment_string_num(numeric);
}

例子:

> increment_alphanumeric_str('test09')
'test10'

唯一的缺点是,如果我们有类似于'test99'这样的东西,它将会失效。


如果字符串后缀中有字母大小写混合的情况,例如 A001B,则代码将无法正常工作。 - AbingPj
如果你从99到100,这个方法就不起作用了,它会输出9100。 - Maestro

1
如果您的ID具有此格式

id='fisher[27].man'

你可以像这样做

   var startIndex = newId.indexOf('[');
   var endIndex = newId.indexOf(']');
   var number = parseInt(newId.substr(startIndex + 1, endIndex - startIndex - 1));
   var incrementedId = number + 1;  // 28

在哪里

var newId = newCloned.attr('id');

0

你可以使用正则表达式替换来轻松实现这一点:

var id = "fisher[27].man";
id = id.replace(/\[(\d+)\]/, function(match, number) {
    return '[' + (parseInt(number, 10) + 1) + ']';
});
// id is now "fisher[28].man"

如果你有 fisher[07].man,它会返回 fisher[8].man - Pithikos
a) 零填充似乎不是 OP 的使用情况之一。 b) 如果你认为这在我的实现中是一个问题,请查看 @Starx 的被接受的答案,它从parseInt中省略了基数参数,因此可能会对零填充数字进行八进制解析 - nrabinowitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接