0

你会如何改变这个:

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"

我希望 SO 上的某个人有更简单的方法来做到这一点……有人吗?

4

5 回答 5

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*)?$- 它不是必须的,但可以多次匹配任何不是数字的东西,然后匹配字符串的结尾
于 2012-09-20T15:47:29.823 回答
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 需要三个不同的子字符串函数?)

于 2012-09-20T18:12:05.817 回答
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);
于 2012-09-20T16:13:06.643 回答
0

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

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

编辑解释:

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

我们知道这里需要更改第 4 项,索引 3 可以通过arr[3]. 这个数组的每一部分都是一个字符串。如果您尝试将字符串增加 1,它只会将字符串与 1 连接起来(JS 使用+for 加法和连接),因此您需要parseInt()在进行加法之前将其设为整数。

然后我们使用该join()方法将数组重新粘合成一个字符串!

于 2012-09-20T15:41:50.790 回答
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

于 2012-09-20T15:44:33.453 回答