2013-03-25 48 views
1

我想在这两个FF和Chrome的JavaScript正则表达式查找/替换被跳过匹配

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

任何想法发生了什么?

回答

1

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

你要做的是要么使用lookaheads使你的匹配不消耗,要么使用\b这是一个零宽度匹配词边界。

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

这应该适合你。

+0

你的解释是伟大的,我现在明白了。问题是JS不支持零宽度lookbehind断言,'\ b'太宽泛,我真的需要空格或parens来匹配数字之前/之后。 – andrew 2013-03-25 22:26:17

+0

是的,我更新了答案。 – OmnipotentEntity 2013-03-25 22:38:27

0

尝试这个办法:从评论

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

感动答案+加积极前瞻:

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