2013-07-25 3 views
0

Я хочу, чтобы преобразовать набор номера из диапазона входов, которые разнообразнырегулярных выражений набора кодовых комбинаций

Если я хочу взять номера, такие как

+65 12345678 
+44 12345678 
+852 12345678 

затем преобразовать их, чтобы стать для всех +65 номер

12345678 

+44 номер стал

001 44 12345678 

затем +852 номера становятся

*852 12345678 

и в то же время извлекая пространства и другие забавные символы, такие как дефис или периоды («-», «»), что является лучшим регулярное выражение, чтобы сделать это или лучшее решение в C#?

+0

Четыре отдельных регулярных выражения, которые выполняют каждую задачу, выполняются отдельно. (Четвертый уход за удалением дефисов, периодов, пробелов и т. Д., Оставшихся после первых трех, выполнил свою работу.) Вы уже пытались сделать хоть одну из них? –

+0

только начинаю, я могу запустить 3, но задавался вопросом, есть ли какие-то более чистые способы сделать это. – user1320651

+0

«Чище» - «проще всего кодировать и обслуживать». Попытка сделать это за один шаг вовсе не «чиста», и в будущем ее будет чрезвычайно сложно модифицировать. –

ответ

1

Вы можете сделать это с помощью делегата:

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; 
    } 
}); 
+0

Хорошо, я понял. Я никогда не смогу получить это через миллион лет – user1320651

0

В конце концов я пошел за перенесенную версию Google 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, действительно hel PED.

Для кого-либо еще, выполняющего эту задачу, я ничего не обнаружил где-нибудь рядом с версией с номером libphonenumber. Он удаляет любой мусор и полностью гвоздит все, что мне нужно, с легкостью. Также можно получить тип линии (мобильный, фиксированный, премиальный и т. Д.), Региональный код для набора номера и многое другое. Работа выполнена благодаря Google.

Смежные вопросы