我在FF和Chrome中尝试了以下内容
' 1 2 3 4 5 6 '.replace(/([\s()])(\d+)([\s()])/g, '$1[num $2]$3');
我期待的结果:
" [num 1] [num 2] [num 3] [num 4] [num 5] [num 6] "
我得到的结果(两个浏览器):
" [num 1] 2 [num 3] 4 [num 5] 6 "
即使简化也会得到相同的结果:
' 1 2 3 4 5 6 '.replace(/\s(\d+)\s/g, ' [num $1] ');
任何想法会发生什么?
答案 0 :(得分:1)
是的,您的\s
消耗了字符。正则表达式多个匹配向前运行以防止无限循环。所以在第一场比赛之后你已经在2之前,但是没有空位可以匹配,所以它忽略了它。
您要做的是使用前瞻使您的匹配消耗殆尽,或者使用\b
这是字边界的零宽度匹配。
' 1 2 3 4 5 6 '.replace(/([\s()])(\d+)(?=[\s()])/g, '$1[num $2]')
这应该适合你。
答案 1 :(得分:1)
从评论中移出答案+添加了积极的前瞻:
' 1 2 3 4 5 6 '.replace(/(\s)(\d+)(?=\s)/g, '$1[num $2]');
答案 2 :(得分:0)
试试这个:
' 1 2 3 4 5 6 '.replace(/(\d+)/g, '[num $1]');