js如何在替换正则表达式的某个分组中的内容

如题:我想要实现的功能是替换stock(1000, 1),将1000替换成其他内容。

最开始我写的正则表达式是

var reg = /(?=stock\()(\d+)/;
var str = 'stock(1000,10)';
str.replace(reg, 999);

但是其实str.match(reg)却返回null

还请各位大佬们指点

阅读 8.5k
5 个回答
'stock(1000, 1)'.replace(/\(\d+(?=,)/g, item => '('+999)

js正则目前只支持先行断言
/d(?=exp)/
// 匹配1exp,返回1
匹配exp前面的内容,exp不计入返回结果.
目前es6有个提案,js支持后行断言(es6入门中是这样写的:)刚刚在谷歌浏览器试了下,发现并不能用)
如果支持,可以这样写

'stock(1000, 1)'.replace(/(?<=\()\d+(?=,)/g, item => '('+999)

V8 引擎4.9版已经支持。
如果不支持,只能先匹配到(1000,将其替换为(999

参考链接:
http://es6.ruanyifeng.com/#do...后行断言

补充:
你说str.match(reg)返回null

'stock(1000,10)'.match(/\((\d+),/)返回的不是null
'stock(1000,10)'.match(/\((\d+),/)[1]返回的是1000.

/\((\d+),/表示,匹配(和,之间的数字,用括号将\d+括起来,表示将多个连续的数字提取出来.

再补充下
上面说,用括号,可以将正则表达式匹配的内容分组,那么你想要实现的效果,可以这样写

'stock(1000,10)'.replace(/(\()\d+(?=,)/g, '$1999')

上面的正则是这样的,匹配(和,之间的数字,并且,不计入返回结果.将(作为一个分组,在replace的第二个参数中引用,$1表示引用正则匹配的第2个分组(从0开始,所以是$1)
此贴终结,哈哈哈

str.replace(/\d+(?=\,)/,999)

根据题意,这个可以

str.replace(/[\d]+/,999)
var reg = /stock\((\d+)/;
var str = 'stock(1000,10)';
str.replace(reg, 'stock(' + 999);
/* 
据我所知,无法直接替换分组的内容
换种思路,既然你不喜欢我,我就去匹配你的闺蜜,这样组成新的一对。
*/

var str = 'stock(1000, 1)';
var reg = /(stock\()[^,]+/g;
str.replace(reg, '$1999');

/* 
这样既保证内容的准确性又能解决问题,
需要注意的是 [^,]+ 意思是除了,都匹配,
也就是,前面的1000,
而 '$1999' 代表旁边的字符$1组合新的字符999
*/
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题