【问题标题】:Best way to compare phone numbers using Regex使用正则表达式比较电话号码的最佳方法
【发布时间】:2014-04-16 09:13:37
【问题描述】:

我有两个存储电话号码的数据库。第一个以 15555555555(美国号码)格式存储它们的国家代码,另一个可以以多种不同格式存储它们(例如 (555) 555-5555、5555555555、555-555-5555、555-5555 , ETC。)。当一个电话号码在一个数据库中退订时,我需要在另一个数据库中退订对它的所有引用。

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

    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 查询中使用替换:

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

【问题讨论】:

  • 你可以看看这个answer
  • 这很有帮助。在这一点上,我不是在寻找最好的表达方式,而是在寻找过滤它的最佳方式。这有意义吗?
  • 每个数字都有规范表示吗? (无论如何,我的第一反应是使用计算列。)
  • 没有。第二个数据库可以包含 value 列中的任何内容。当我今天查看一个数据库时,它甚至包含值“djahdh”。我查看了计算列,如下所示:stackoverflow.com/questions/15655813/…

标签: regex entity-framework


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2017-09-23
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多