1

我正在 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] ');

有什么想法吗?

4

3 回答 3

1

是的,您\s的 s 正在消耗字符。正则表达式多个匹配向前运行以防止无限循环。所以在第一场比赛之后你已经在 2 之前,但是没有空格可以匹配,所以它会忽略它。

您想要做的是使用前瞻使您的匹配不消耗,或者使用\b它是单词边界的零宽度匹配。

' 1 2 3 4 5 6 '.replace(/([\s()])(\d+)(?=[\s()])/g, '$1[num $2]')

这应该适合你。

于 2013-03-25T22:21:28.283 回答
1

从评论中移动答案+添加了积极的前瞻:

' 1 2 3 4 5 6 '.replace(/(\s)(\d+)(?=\s)/g, '$1[num $2]');
于 2013-03-25T22:38:25.410 回答
0

尝试这个:

' 1 2 3 4 5 6 '.replace(/(\d+)/g, '[num $1]');
于 2013-03-25T22:21:40.183 回答