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

但是,这显然是添加非所需的空间。

+0

那么这是一个严格的正则表达式问题。一旦所有组都被识别,表达式就会匹配。角部分是好的。 – curuba

+0

只需在每次更改时运行正则表达式。为此,使用onchange或keyup-listener。 – mercredo

+0

您可以节省一些头痛,并在第二步中删除“不需要的空间”,将其包装在过滤器中。 – AJcodez

你说你希望它是“直截了当”,但你人为地约束问题(通过强制的解决方案是唯一的正则表达式),当纯的正则表达式实际上是一个错误的解决方案解决这个问题。

为什么?因为你的问题涉及有条件地向输出中添加新的字符(空格),这些字符可能不会出现在输入中,但不应该总是添加 - .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(" "); 

+0

哦,真好!这很棒。我只需要添加一个空值检查,但除此之外它很棒。 – curuba

+0

@curuba添加了一个调整,以避免空案的答案。 :) – Amber

+0

不错的更新!谢谢 – curuba

你可以尝试一个级联样式。

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* 
        )? 
       )? 
      )? 
    )? 
)? 
+0

这仍然会增加额外的空间,并导致更复杂的正则表达式启动。沿着这条道路是疯狂的。 – Amber

+0

@Amber - 空间与什么有什么关系? ''输入格式的电话号码“'在每次按键时,除了格式化文本外,您再也看不到其他任何内容。就复杂的正则表达式而言,疯狂......略微夸张,你不觉得吗? – sln

+0

如果格式化的值被放回到输入字段(“正如它被键入”时经常指出的那样),则多余的空格将导致光标跳动。 – Amber