2016-08-02 79 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/ –