Javascript 字符串增量:将最后一个字符串增量1

Javascript 字符串增量:将最后一个字符串增量1,javascript,regex,string,numbers,increment,Javascript,Regex,String,Numbers,Increment,这段代码的目的是编写一个递增字符串的函数,以创建一个新字符串。如果字符串已以数字结尾,则该数字应递增1。如果字符串未以数字结尾,则应将数字1追加到新字符串。e、 g.“foo123”->“foo124”或“foo”->“foo1”。 在下面的代码中,我几乎所有的测试用例都通过了,除了“foo999”的一个角用例没有打印出“foo1000”。我知道应该有办法用正则表达式来解决我的问题,但我对它不太熟悉。有人能帮忙吗 函数递增字符串(输入){ var reg=/[0-9]/; var结果=”; i

这段代码的目的是编写一个递增字符串的函数,以创建一个新字符串。如果字符串已以数字结尾,则该数字应递增1。如果字符串未以数字结尾,则应将数字1追加到新字符串。e、 g.“foo123”->“foo124”或“foo”->“foo1”。 在下面的代码中,我几乎所有的测试用例都通过了,除了“foo999”的一个角用例没有打印出“foo1000”。我知道应该有办法用正则表达式来解决我的问题,但我对它不太熟悉。有人能帮忙吗

函数递增字符串(输入){
var reg=/[0-9]/;
var结果=”;
if(注册测试(输入[input.length-1])==true){
输入=输入。拆分(“”);
对于(变量i=0;i}
您可以使用“替换为回调”:

'foo'.replace(/(\d*)$/, function($0, $1) { return $1*1+1; });
//=> "foo1"
'foo999'.replace(/(\d*)$/, function($0, $1) { return $1*1+1; });
//=> "foo1000"
'foo123'.replace(/(\d*)$/, function($0, $1) { return $1*1+1; });
//=> "foo124"
说明:

/(\d*)$/                # match 0 or more digits at the end of string
function($0, $1) {...}  # callback function with 2nd parameter as matched group #1
return $1*1+1;          # return captured number+1. $1*1 is a trick to convert
                        # string to number

我认为您可以大大简化代码:

function incrementString(input) {
    var splits = input.split(/(\d+)$/),
    num = 1;
    if (splits[1] !== undefined) num = parseInt(splits[1]) + 1;
    return splits[0] + num;
}
这将检查字符串末尾的任意位数。

功能板(数字、长度、填充符){
function pad(number, length, filler) {
    number = number + "";
    if (number.length < length) {
        for (var i = number.length; i < length; i += 1) {
            number = filler + number;
        }
    }

    return number;
}

function incrementString (input) {
    var orig = input.match(/\d+$/);
    if (orig.length === 1) {
        orig = pad(parseInt(orig[0]) + 1, orig[0].length, '0');
        input = input.replace(/\d+$/, orig);
        return input;
    }

    return input + "1";
}
数字=数字+“”; if(number.length
它有什么作用

它首先检查是否有尾随数字。如果是的话,增加它并用零填充(使用“pad”函数,您可以自己进行排序)

string.replace
是一个函数,它使用参数1作为要搜索的子字符串(string,regex),参数2作为要替换的元素(string,function)

在本例中,我使用了一个正则表达式作为第一个参数和递增的填充数字

正则表达式非常简单:
\d
表示“整数”,而
+
表示“一个或多个前面的数字”,表示一个或多个数字<代码>$
表示字符串的结尾

关于正则表达式的更多信息(JavaScript):(感谢@Casimir et Hippolyte的链接)

函数递增字符串(strng){
//从字符串中分离数字
设x=(strng.replace(/^\D+/g');
//从字符串中获取原始数字的长度
设len=x.长度;
//从strng获取字符串部分
str=标准分割(x);
//将数字增加1
设数=数(x)+1+'';
//用0填充数字,使其长度与原始数字完全一致
while(number.length
我的快速回答是:

let newStr = string.split('');
let word = [];
let num = [];
for (let i = 0 ; i<string.length ;i++){
  isNaN(string[i])? word.push(string[i]) : num.push(string[i]) 
}
let l=num.length-1;
let pureNum=0;
for (let i = 0 ; i<num.length ;i++){
  pureNum += num[i] * Math.pow(10,l);
  l--;
}
let wordNum = (pureNum+1).toString().split('');
for (let i = wordNum.length ; i<num.length ;i++){
  wordNum.unshift("0");
}
return word.join("")+wordNum.join(""); 
}
let newStr=string.split(“”);
让单词=[];
设num=[];

对于(设i=0;i),我所见过的解释前导零、非数字结尾和空字符串的最简洁方法是:

''.replace(/[0-8]?9*$/, w => ++w)
//=> 1

'foo'.replace(/[0-8]?9*$/, w => ++w)
//=> foo1

'foo099'.replace(/[0-8]?9*$/, w => ++w)
//=> foo100

'foo999'.replace(/[0-8]?9*$/, w => ++w)
//=> foo1000

你的函数太复杂了,你应该用lambda替换
replace
方法。这没有考虑像
1foo1
@Jack:True这样的字符串,但是OP没有提到需要处理这些字符串。这个答案更大的问题是,它没有解释任何事情,它只是给人一条鱼,而没有任何解释教他钓鱼。仅供参考,“split”的过去式是“split”,而不是“splitted”(我认为这是一个不规则动词,但英语中有太多的动词样式,很容易成为某些样式的规则形式)。您应该用1而不是0初始化
num
。@casimimirithippolyte:正确,我没有彻底阅读要求。@t.J.Crowder:谢谢您的提示-
splitted
不是一个好的变量名。
split
也不是:-)我更新了代码。修复!现在它只检查最后一个字符是否是数字,如果没有找到,它会在字符串的末尾加上“1:)天哪,你们太棒了!让我检查代码,如果我有任何问题,请返回给你:)!!代码基本上通过了测试,只是没有通过测试:“foobar000”-->“foobar001”@有人anubhava的解决方案也有同样的问题,那么为什么现在就接受他的呢?在任何情况下,添加了填充内容,因此
foo000->foo001
@Someone:0001到0002的新要求是从哪里来的?这是您问题的一部分吗?欢迎您做一些解释,因为您的代码没有注释,说明性不强
''.replace(/[0-8]?9*$/, w => ++w)
//=> 1

'foo'.replace(/[0-8]?9*$/, w => ++w)
//=> foo1

'foo099'.replace(/[0-8]?9*$/, w => ++w)
//=> foo100

'foo999'.replace(/[0-8]?9*$/, w => ++w)
//=> foo1000