Разобрать номер телефона на составные части - PullRequest
11 голосов
/ 23 октября 2008

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

  • 3035551234122
  • 1-303-555-1234x122
  • (303) 555-1234-122 * +1008 *
  • 1 (303) 555 -1234-122

и т.д ...

все разбираются на:

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

Ответы [ 6 ]

19 голосов
/ 15 июля 2011

Ни один из приведенных ответов не был достаточно надежным для меня, поэтому я продолжил искать что-то лучшее и нашел это:

Библиотека Google для работы с телефонными номерами

Я надеюсь, что это также полезно для вас.

3 голосов
/ 23 октября 2008

Я использую это:

^(?:(?:[\+]?(?<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 Я верю.

1 голос
/ 09 июля 2011

Вот хорошо написанная библиотека, используемая, например, с GeoIP:

http://highway.to/geoip/numberparser.inc

1 голос
/ 23 октября 2008

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

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"];
1 голос
/ 23 октября 2008

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

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

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

0 голосов
/ 31 мая 2013

вот способ проще для глаз, предоставляемый Z Directory (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", и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...