使用Regex比较电话号码的最佳方式

时间:2014-04-15 20:28:40

标签: regex entity-framework

我有两个存储电话号码的数据库。第一个用国家代码存储格式为15555555555(美国编号),另一个可以以多种不同格式存储它们(例如(555)555-5555,5555555555,555-555-5555,555-5555)等)。如果电话号码在一个数据库中取消订阅,我需要在其他数据库中取消订阅对它的所有引用。

在第二个数据库中查找与第一个数据库中的号码匹配的所有电话号码实例的最佳方法是什么?我正在使用实体框架。我的代码现在看起来像这样:

    using (FusionEntities db = new FusionEntities())
    {

            var communications = db.Communications.Where(x => x.ValueType == 105);

            foreach (var com in communications)
            {
                string sRegexCompare = Regex.Replace(com.Value, "[^0-9]", "");
                if (sMobileNumber.Contains(sRegexCompare) && sRegexCompare.Length > 6)
                {
                    var contact = db.Contacts.Where(x => x.ContactID == com.ContactID).FirstOrDefault();
                    contact.SMSOptOutDate = DateTime.Now;
                }
            }
    }

现在,我的比较检查在删除所有非数字字符后,第一个数据库是否包含来自第二个数据库的至少7个数字。

理想情况下,我希望能够将正则表达式格式应用到代码中从数据库中获取数据的位置。最初我试过这个,但我不能在LINQ查询中使用replace:

var communications = db.Communications.Where(x => x.ValueType == 105 && sMobileNumber.Contains(Regex.Replace(x.Value, "[^0-9]", "")));

1 个答案:

答案 0 :(得分:1)

比较电话号码有点超出了设计的正则表达式的能力。正如您所发现的那样,有许多方法可以表示电话号码,包括区号和格式等。正则表达式用于模式匹配,因此您可以使用正则表达式去除所有格式,然后比较字符串是可行的,但将逻辑放入正则表达式中并不是它的用途。

我建议第一个也是最重要的事情就是理清电话号码的表示。由于您具有数据库访问权限,因此您可能希望查看创建新字段或表以表示电话号码对象。然后将比较逻辑放在模型中。

是的,它的工作量更大,但它可以使代码更易于理解,并有助于清理垃圾数据。