【问题标题】:String increment: increment the last string by one字符串增量:将最后一个字符串加一
【发布时间】:2015-06-18 12:37:33
【问题描述】:

这段代码的目的是编写一个递增字符串的函数,以创建一个新字符串。如果字符串已经以数字结尾,则该数字应增加 1。如果字符串不以数字结尾,则应将数字 1 附加到新字符串中。例如"foo123" --> "foo124" 或 "foo" --> "foo1"。 使用下面的代码,我几乎所有的测试用例都通过了,除了“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;
  }
}

【问题讨论】:

  • 你的函数太复杂了,你应该用replace方法加上一个lambda作为替代。

标签: javascript regex string numbers increment


【解决方案1】:

您可以将替换与回调一起使用:

'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

【讨论】:

  • 这不考虑像1foo1这样的字符串
  • @Jack:是的,但 OP 没有提到需要处理这些。这个答案更大的问题是它没有解释任何东西,它只是给了男人一条鱼,而没有他钓鱼。
【解决方案2】:

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

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

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

【讨论】:

  • 仅供参考,“split”的过去时是“split”,而不是“splitted”(我会说它是一个不规则动词,但英语中的动词风格很多,很容易成为某种风格的常规形式)。
  • 你应该用 1 而不是 0 来初始化 num
  • @CasimiretHippolyte:正确,我没有仔细阅读要求。 @T.J.Crowder:感谢这个提示 - splitted 不是一个好的变量名。 split 也不是 :-) 我更新了代码。
【解决方案3】:
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 要搜索的子字符串(字符串,正则表达式),参数 2 要替换的元素(字符串,函数)。

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

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

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

【讨论】:

  • 已修复!现在它只检查最后一个字符是否为数字,如果没有找到,它会在字符串末尾添加“1”:)
  • 天啊,你们太棒了!如果我有任何问题,让我检查代码并回复你:)!!
  • 代码基本上通过了极端情况,只是没有通过这个测试:“foobar000”--->“foobar001”
  • @Someone anubhava 的解决方案有同样的问题,那为什么现在接受他的呢?无论如何,添加填充的东西,以便foo000 -&gt; foo001.
  • @Someone:0001到0002这个新要求是从哪里来的?这是您问题的一部分吗?
【解决方案4】:
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;
    }

【讨论】:

    【解决方案5】:

    我的快速回答是:

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

    【讨论】:

    • 欢迎解释一下,因为你的代码没有 cmets 不是很有指导意义
    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 2020-12-23
      • 2022-06-17
      相关资源
      最近更新 更多