Ответ 1
Ни один из ответов, данных до сих пор, не был достаточно надежным для меня, поэтому я продолжил искать что-то лучшее и нашел это:
Библиотека Google для работы с телефонными номерами
Я надеюсь, что это также полезно для вас.
Мне нужно хорошо протестированное регулярное выражение (предпочтительнее стиль .net) или какой-либо другой простой бит кода, который будет анализировать телефонный номер США /CA на составные части, поэтому:
и т.д...
все разобрать на:
Ни один из ответов, данных до сих пор, не был достаточно надежным для меня, поэтому я продолжил искать что-то лучшее и нашел это:
Библиотека Google для работы с телефонными номерами
Я надеюсь, что это также полезно для вас.
Это я использую:
^(?:(?:[\+]?(?<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?(\d{3})(\d{3})(\d{4})(\d*)$/
Поддержка всех кодов стран немного сложнее, но применяется одно и то же общее правило.
Это регулярное выражение работает именно так, как вы хотите, с помощью ваших примеров:
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"];
Вот хорошо написанная библиотека, используемая с GeoIP, например:
здесь метод проще для глаз, предоставленных 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", и др.