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

时间:2015-04-13 08:48:51

标签: javascript regex string numbers increment

此代码的目的是编写一个递增字符串的函数,以创建一个新字符串。如果字符串已经以数字结尾,则该数字应增加1.如果字符串不以数字结尾,则应将数字1附加到新字符串。例如" foo123" - > " foo124"或" foo" - > " foo1&#34 ;. 使用下面的代码,几乎我的所有测试用例都被传递,除了#34; foo999"没有打印出来" foo1000"。我知道应该有一种方法可以用正则表达式来解决我的问题,但我不太熟悉它。有人可以帮忙吗?



function incrementString (input) {
  var reg = /[0-9]/;
  var result = "";
  if(reg.test(input[input.length - 1]) === true){
    input = input.split("");
    for(var i = 0; i < input.length; i++){
        if(parseInt(input[i]) === NaN){
            result += input[i];
        }
        else if(i === input.length - 1){
            result += (parseInt(input[i]) + 1).toString();
        }
        else{
            result += input[i];
        }
    }
    return result;
  }
  else if (reg.test(input[input.length - 1]) === false){
    return input += 1;
  }
}
&#13;
&#13;
&#13;

6 个答案:

答案 0 :(得分:2)

您可以使用替换回调:

'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

答案 1 :(得分:0)

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

function incrementString(input) {
    var splits = input.split(/(\d+)$/),
    num = 1;
    if (splits[1] !== undefined) num = parseInt(splits[1]) + 1;
    return splits[0] + num;
}

这将检查字符串末尾的任意位数。

答案 2 :(得分:0)

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";
}

它做了什么?

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

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

在这种情况下,我使用正则表达式作为第一个参数和递增的填充数字。

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

有关正则表达式的更多信息(在JavaScript中):https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp(感谢@Casimir et Hippolyte的链接)

答案 3 :(得分:0)

function incrementString (strng) {
      //separateing number from string
        let x = (strng).replace( /^\D+/g, '');
      //getting the length of original number from the string
      let len = x.length;

      //getting the string part from strng
      str = strng.split(x);

      //incrementing number by 1
      let number = Number(x) + 1 + '';

      //padding the number with 0 to make it's length exactly to orignal number
      while(number.length < len){
        number = '0' + number;
      }

    //new string by joining string and the incremented number
      str = (str + number).split(',').join('');
      //return new string
      return str;
    }

答案 4 :(得分:0)

我的快速答案是:

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(""); 
}

答案 5 :(得分:0)

我见过的最简洁的方法也可以解释前导零、非数字结尾和空字符串:

''.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