3

我有一个正则表达式可以清理电话号码并将它们转换为有效的电话号码:+1 123-1223。

正则表达式:

Regex.Replace(phone, @"^\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*$", "+1 $1$2$3-$4$5$6-$7$8$9$10");

但我想添加它,所以超过 12 个数字的任何数字都会添加剩余的数字作为扩展名。因此,如果号码是 810.232.122323,它将变为 +1 810-232-1223 x23。

这可以通过更改正则表达式来实现吗?有没有好的方法来做到这一点?我不太了解正则表达式。谢谢!

4

1 回答 1

2

只需将其添加到末尾,它将是您的第 11 组(除非它实际上有 2 位数或更多位数,否则它不会接听分机

(\d{2,})

代码将是:

Regex.Replace(phone, 
    @"^\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d{2,})$", 
    "+1 $1$2$3-$4$5$6-$7$8$9$10 Ext $11");

如果这是可选的,请执行以下操作:

(\d{2,})?

它仍然会匹配您的电话号码,但不会像上面那样强制分机

要使这个可选也不使用分机,那么你需要使用MatchEvaluator

像这样的东西(但我面前没有编译器,所以它可能会偏离一点,应该进行测试)

Regex.Replace(phone, 
    @"^\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d{2,})$", 
    "+1 $1$2$3-$4$5$6-$7$8$9$10 Ext $11");
     match =>
     {
         var returnVal = "+1 ";
         for(int i = 1; i <= 3; i++)
         {
             returnVal += match.Groups[i].Value;
             if(i == 3 || i == 6)
                 returnVal += "-";
         }
         returnVal += match.Groups[11].Success ? " Ext " + match.Groups[11] : "" )
         return returnVal;
     }
)
于 2012-04-17T15:34:49.290 回答