如何用javascript替换字符串中数字的最后一次出现?

时间:2012-09-20 15:36:40

标签: javascript regex

你怎么改变这个:

a-10-b-19-c

这样的事情:

a-10-b-20-c

在Javascript中使用正则表达式?

它也应该改变这个:

a-10-b-19

进入这个:

a-10-b-20

到目前为止我找到的唯一解决方案是:

  • 反转原始字符串 - > "c-91-b-01-a"
  • 找到第一个号码(\d+) - > "91"
  • 反转它 - > "19"
  • 转入数字(parseInt) - > 19
  • 向其添加1 - > 20
  • 再次将其转换为字符串(toString) - > "20"
  • 再次反转 - > "02"
  • 用这个新号码替换原始匹配 - > "c-02-b-01-a"
  • 反转字符串 - > "a-10-b-20-c"

我希望有人可以用更简单的方式做到这一点......任何人?

5 个答案:

答案 0 :(得分:4)

这是一种简单的方法。

var str = 'a-10-b-19-c';
str = str.replace(/(\d*)(?=(\D*)?$)/, +str.match(/(\d*)(?=(\D*)?$)/)[0]+1);

+str.match找到19,将其加1并返回20. +确保答案为int。 str.replace找到19并将其替换为str.match返回的20。

解释

  • (\d*) - 匹配任何数字
  • (?=...) - 积极前瞻,不会改变正则表达式的位置,但会确保该模式在线下进一步存在。
  • (\D*)?$ - 它不必,但可以匹配多次不是数字的任何内容,然后匹配字符串的结尾

答案 1 :(得分:1)

//replaces last digit sequences with 20
'a-10-b-19-c'.replace(/\d+(?!.*\d+)/, '20') 

/ - >正则表达式的开始

\d+ - >匹配任何数字(一个或多个)

(?!.*\d+) - >负向前看断言我们找不到任何未来(一个或多个)数字

/ - >正则表达式结束

编辑:重新阅读添加,

可以使用匹配,例如:

    var m ='a-10-b-19-c'.match(/\d+(?!.*\d+)/);
    'a-10-b-19-c'.replace(/\d+(?!.*\d+)/, parseInt(m[0]) + 1);

答案 2 :(得分:1)

这是一个更简单的一个:

str.replace(/(.*\D)(\d+)/, function(s, pfx, n) {return pfx + ((+n) + 1)})

str.replace(/.*\D(\d+)/, function(s, n) {return s.slice(0, -n.length) + ((+n) + 1)})

如果数字是字符串中的第一个,那么这些都不会起作用,但是这个会:

(' ' + str).replace(/.*\D(\d+)/,
                    function(s, n) {
                      return s.slice(1, -n.length) + ((+n) + 1)
                    })

(为什么Javascript需要三个不同的子字符串函数?)

答案 3 :(得分:0)

这是我能想到的最简单的方法:

var str = 'a-10-b-19-c';
var arr = str.split('-');
arr[3] = parseInt(arr[3]) + 1;
str = arr.join('-');

编辑解释:

split()方法接受参数(在本例中为连字符),并在找到的每个实例中将其分解为数组。如果您在此部分运行后在JavaScript控制台中输入arr,则会获得["a", "10", "b", "19", "c"]

我们知道我们需要在这里更改第4项,索引3通过arr[3]访问。这个数组的每一部分都是一个字符串。如果您尝试将字符串递增1,它将简单地将字符串与1连接(JS使用+进行添加和连接),因此您需要先使用parseInt()使其成为整数另外。

然后我们使用join()方法将数组粘合在一起形成一个字符串!

答案 4 :(得分:0)

试试这个:

var str='a-10-b-19-c';
var pattern=/\d+/g;
var matches=pattern.exec(str);
var last=matches[0];
while((matches=pattern.exec(str))!=null)
{
    last=matches[0];
}
var newStr=str.replace(last, parseInt(last)+1);
console.log(newStr);

代码输出a-10-b-20-c