正则表达式电话号码实时格式化

时间:2015-05-31 17:26:50

标签: javascript regex angularjs

在AngularJS中,我需要在输入时格式化电话号码。 我不想使用任何库,因为这应该是直截了当的。

我需要的格式为:99 99 99 99 99

var phone = tel.replace(/\D*(\d{2})\D*(\d{2})\D*(\d{2})\D*(\d{2})\D*(\d{2})\D*/, '$1 $2 $3 $4 $5');

但是只有在完全输入后才能格式化我的号码。当数字尚未完成时,如何使这个正则表达式工作?

然后我尝试了这个:

var phone = tel.replace(/\D*(\d{2})\D*(\d{0,2})?\D*(\d{0,2})?\D*(\d{0,2})?\D*(\d{0,2})?\D*/, '$1 $2 $3 $4 $5');

但这显然是添加了非必需的空格。

2 个答案:

答案 0 :(得分:4)

你说你想要它直接前进"但是当你纯粹的正则表达式实际上是一个糟糕的解决方案时,你会人为地限制问题(强制解决方案只是正则表达式)问题

为什么呢?因为您的问题涉及有条件地将新字符添加到输出中可能没有出现的输出(空格),但是不应该总是添加 - .replace()没有能力处理它。 / p>

最好使用正则表达式和其他JavaScript的组合来处理条件格式:

// Get only the digits from the string
var phoneDigits = tel.replace(/\D/g, "");
// Join together the first up-to-5 pairs of digits with spaces,
// allowing for a singleton if the number of digits is odd.
var phone = (phoneDigits.match(/\d\d?/g) || []).slice(0,5).join(" ");

|| []位避免了当没有数字时匹配返回null的情况。)

答案 1 :(得分:0)

您可以尝试级联风格模式。

\D* (?: ( \d{2} ) # (1) \D* (?: ( \d{2} ) # (2) \D* (?: ( \d{2} ) # (3) \D* (?: ( \d{2} ) # (4) \D* (?: ( \d{2} ) # (5) \D* )? )? )? )? )?

data: JSON.stringify({ "email": $("#email").val(), "name": $("#name").val(), "message": $("#message").val() }),