Выполнить телефонный номер в составные части

Мне нужно хорошо протестированное регулярное выражение (предпочтительнее стиль .net) или какой-либо другой простой бит кода, который будет анализировать телефонный номер США /CA на составные части, поэтому:

  • 3035551234122
  • 1-303-555-1234x122
  • (303) 555-1234-122
  • 1 (303) 555 -1234-122

и т.д...

все разобрать на:

  • AreaCode: 303
  • Обмен: 555
  • Суффикс: 1234
  • Расширение: 122

Ответ 2

Это я использую:

^(?:(?:[\+]?(?<CountryCode>[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?<AreaCode>[\d]{3})[\-/)]?(?:[ ]+)?)?(?<Number>[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?<Ext>[\d]{1,5}))?$

Я получил его из RegexLib Я считаю.

Ответ 3

Удалите все, что не является цифрой. Затем все ваши примеры уменьшатся до:

/^1?(\d{3})(\d{3})(\d{4})(\d*)$/

Поддержка всех кодов стран немного сложнее, но применяется одно и то же общее правило.

Ответ 4

Это регулярное выражение работает именно так, как вы хотите, с помощью ваших примеров:

Regex regexObj = new Regex(@"\(?(?<AreaCode>[0-9]{3})\)?[-. ]?(?<Exchange>[0-9]{3})[-. ]*?(?<Suffix>[0-9]{4})[-. x]?(?<Extension>[0-9]{3})");
Match matchResult = regexObj.Match("1 (303) 555 -1234-122");

// Now you have the results in groups 
matchResult.Groups["AreaCode"];
matchResult.Groups["Exchange"];
matchResult.Groups["Suffix"];
matchResult.Groups["Extension"];

Ответ 6

здесь метод проще для глаз, предоставленных Z-каталогом (vettrasoft.com), ориентированы на номера американских телефонов:

string_o s2, s1 = "888/872.7676";
z_fix_phone_number (s1, s2);
cout << s2.print();      // prints "+1 (888) 872-7676"
phone_number_o pho = s2;
pho.store_save();

последняя строка хранит номер в таблице базы данных "phone_number". значения столбца: country_code = "1", area_code = "888", exchange = "872", и др.