Regex电话号码实时格式化
问题描述:
在AngularJS中,我需要格式化电话号码,而他们正在键入。 我不想使用任何库,因为这应该是直接的。Regex电话号码实时格式化
我需要的格式是: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');
但是,这显然是添加非所需的空间。
答
你说你希望它是“直截了当”,但你人为地约束问题(通过强制的解决方案是唯一的正则表达式),当纯的正则表达式实际上是一个错误的解决方案解决这个问题。
为什么?因为你的问题涉及有条件地向输出中添加新的字符(空格),这些字符可能不会出现在输入中,但不应该总是添加 - .replace()
没有配备处理这个问题。
你会更好使用正则表达式和其他JavaScript的组合来处理条件格式:(该|| []
位避免了比赛返回null
时没有数字都存在的情况下)
// 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(" ");
答
你可以尝试一个级联样式。
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');
\D*
(?:
(\d{2}) # (1)
\D*
(?:
(\d{2}) # (2)
\D*
(?:
(\d{2}) # (3)
\D*
(?:
(\d{2}) # (4)
\D*
(?:
(\d{2}) # (5)
\D*
)?
)?
)?
)?
)?
那么这是一个严格的正则表达式问题。一旦所有组都被识别,表达式就会匹配。角部分是好的。 – curuba
只需在每次更改时运行正则表达式。为此,使用onchange或keyup-listener。 – mercredo
您可以节省一些头痛,并在第二步中删除“不需要的空间”,将其包装在过滤器中。 – AJcodez