2016-08-02 35 views
2

我有这个表达式:使用正则表达式替换,同时输入到输入字段

(/(\d{2})(\d{3})(\d{2})/g; 

我想要做的就是更换每2,当每3,当每2再次用“”,而角色打字。这意味着如果我输入“123”,它应该格式化为“12 3”,如果我输入“12345”,它应该被格式化为“12 123”

但是,我只在每7个字符后才得到一个间距。 这里是一个jsfiddle:http://jsfiddle.net/K4WXc/257/

帮助将不胜感激!

+0

应为'123456'和'1234567','123465789'输出什么? – Tushar

+0

尝试['return v.replace(/ \ d(?=(\ d {3})+ $)|^\ d(?= \ d {2} $)/ g,“$ & ");' //jsfiddle.net/xsy4femz/),让我们知道是否符合你的要求 –

+0

@Tushar'的模式是“xx xxx xx”,所以如果我输入123456,它应该在输入中看起来是“12 345 6”。 1234567它应该是“12 345 67”,对于123465789它应该是“12 346 57”(我将用maxlength属性更新我的jsfiddle,因此不可能输入更长的字符串) – Mojique

回答

1

我已经修改了你的fiddle如下图所示:

return v.replace(/^(\d{2})(\d{1,3})(\d{0,2}).*/, function (match, a, b, c) { 
     return a + ' ' + b + (c == '' ? '' : ' ' + c); 
    }); 

铭记眼前这个块之前,已删除所有非数字字符,此块预期只是个数字(无空格)。

这2个数字匹配开头:^(\d{2})

然后1至3作为下一个捕获组:(\d{1,3})

如果在第二组有3个,就会获得可达2个:(\d{0,2})

什么比这更将被丢弃:.*

这样做的重要组成部分,使其能够在您键入匹配“不完整”的条目是即使您没有输入第二组的所有3位数字,或者第三组都是三位数字,也会匹配。

注意:您的原始替换的主要问题是缺少的第一个参数代表整个匹配的字符串。

+0

感谢您的代码和解释! – Mojique

+0

我修改代码以接受输入过滤器的数据参数:http://jsfiddle.net/MrPolywhirl/K4WXc/263/ –