正则表达式拨号代码模式

本文关键字:模式 代码 正则表达式 | 更新日期: 2023-09-27 18:24:52

我想从一系列不同的输入中转换拨号号码

如果我想取之类的号码

 +65 12345678
 +44 12345678
 +852 12345678

然后将它们转换为所有+65个数字的

12345678

+44个数字成为

001 44 12345678

然后+852个号码变成

*852 12345678

同时删除空格和其他有趣的字符,如连字符或句点("-",".")什么是最好的正则表达式或c#中的最佳解决方案?

正则表达式拨号代码模式

您可以使用委托来完成此操作:

Regex reg = new Regex(@"'+('d{2,3})[-. ]('d{8})");
string result = reg.Replace(input, delegate(Match m) {
    switch (m.Groups[1].Value) {
        case "65":  return m.Groups[2].Value;
                    break;
        case "44":  return "001 44 " + m.Groups[2].Value;
                    break;
        case "852": return "*852 " + m.Groups[2].Value;
                    break;
        default:    return m.Value;
                    break;
    }
});

最终我选择了谷歌libphonenumber 的移植版本

bitbucket.org/pmezard/libphonenumber-csharp/wiki/Home

    private DialedNumber applyCallPattern(string noToDial)
    {
        noToDial = noToDial.Replace("callto:", ""); 
       //libphone removes text anyway so this line above is not needed

        PhoneNumberUtil phoneUtil = PhoneNumberUtil.GetInstance();
        string dc = "SG";
        if (AutoDialer.Properties.Settings.Default.BaseOffice == "Hong Kong")
        {
            dc = "HK";
        }
        PhoneNumber pn = phoneUtil.Parse(noToDial, dc);
        string rc = phoneUtil.GetRegionCodeForNumber(pn);
        string dialingNumber = null;

        if (rc == "SG")
        {
            dialingNumber = phoneUtil.Format(pn, PhoneNumberFormat.NATIONAL);
            if (AutoDialer.Properties.Settings.Default.BaseOffice == "Hong Kong")
            {
                dialingNumber = "*65" + dialingNumber;
            }
        }
        else if (rc == "HK")
        {
            dialingNumber = phoneUtil.Format(pn, PhoneNumberFormat.NATIONAL);
            if (AutoDialer.Properties.Settings.Default.BaseOffice == "Singapore")
            {
                dialingNumber = "*852" + dialingNumber;
            }
        }
        else
        {
            dialingNumber = phoneUtil.Format(pn, PhoneNumberFormat.E164);
            dialingNumber = dialingNumber.Replace("+", "001");
        }
        dialingNumber = dialingNumber.Replace(" ", "");
        DialPopup popup = new DialPopup();
        popup.label1.Text = "Calling: " + dialingNumber;
        popup.Show();
        DialedNumber dn = new DialedNumber(dialingNumber, phoneUtil.GetRegionCodeForNumber(pn), phoneUtil.GetNumberType(pn).ToString(), DateTime.Now, false);
        Program.lastNoDialed = dialingNumber;
        return dn;
    }

libphonenumber摇滚,让它更容易,所以感谢Alden的建议,真的很有帮助。

对于其他做这项任务的人来说,我还没有发现任何东西能像libphonenumber移植版本那样好。它可以轻松地去除任何垃圾,完全钉住我需要的一切。还可以获得线路类型(移动、固定、高级等)、拨号地区代码以及更多信息。工作完成了,感谢谷歌。