Как разделить номер мобильного телефона на код страны, код области и локальное число? например, +919567123456, после того, как разделено
код страны = 91
код области = 9567
локальное число = 123456
Невозможно проанализировать телефонные номера с помощью простого алгоритма, вам нужно использовать таблицы данных, заполненные правилами каждой страны, потому что каждая страна разграничивает свои телефонные номера по-разному.
Код страны довольно прост, просто используйте данные из статьи Телефонные коды стран в Википедии и создайте таблицу всех уникальных кодов стран. У каждой страны есть уникальный префикс, так что это легко.
Но тогда вам нужно найти правила для каждой страны, которую вы хотите поддерживать, и извлечь код (а) города, используя правила для каждой страны.
Как упоминалось разными людьми, вы не можете сделать это с помощью простой строки соответствие. Длины кодов страны и города не фиксированы.
Сделав это в прошлом, мы поддерживали таблицу, аналогичную по структуре следующей: -
+------------+---------+-------+--------------+ |country_code|area_code|country|area | +------------+---------+-------+--------------+ |44 |1634 |UK |Medway | |44 |20 |UK |London | |964 |23 |Iraq |Wasit (Al Kut)| |964 |2412 |Iraq |Unreal | +------------+---------+-------+--------------+
Затем мы вычислили максимальную длину area_code и country_code и проверили строку путем подстроки, начиная с максимальной длины и работая с нашим путь вниз, пока мы не нашли совпадение.
Таким образом, учитывая число 441634666788
, мы начали бы с подстроки [1,7] (7 - длина самой длинной комбинации кода страны / города), не нашли совпадения, а затем перешли бы к [1, 6] и нашел совпадение для UK / Medway.
Не очень эффективно, но сработало.
РЕДАКТИРОВАТЬ
Вы также можете попробовать что-то подобное, но вам нужно будет протестировать его с полным набором данных или, возможно, даже разбить его на отдельные страны и коды регионов, так как это может быть не очень эффективно с выбранной вами БД. .
DECLARE @area_codes TABLE
(
country_code VARCHAR(10),
area_code VARCHAR(10),
country VARCHAR(20),
area VARCHAR(20),
match_string VARCHAR(MAX),
match_length INTEGER
)
INSERT INTO @area_codes VALUES ('44','1382','UK','Dundee', '441382%', 6)
INSERT INTO @area_codes VALUES ('44','1386','UK','Evesham', '441386%', 6)
INSERT INTO @area_codes VALUES ('44', '1', 'UK', 'Geographic numbers', '441%', 3)
DECLARE @number VARCHAR(MAX)
SET @number = '441386111111'
SELECT TOP 1 *
FROM @area_codes
WHERE @number LIKE match_string
ORDER BY match_length DESC
Вы должны поддерживать поля match_string и match_length с помощью триггера, заботясь о том, чтобы справиться с нулевыми кодами областей и проиндексировать таблицу по столбцу match_string.
Ответ во многом зависит от страны. Не существует универсального правила, говорящего «это код страны, это код города, это местный номер».Единственная информация, которую можно получить повсеместно, - это номер страны (и даже он может состоять из 1-4 цифр); тогда вам нужно проконсультироваться с правилами конкретной страны.
Для примеров (например, «в данных странах много разных телефонных номеров, но все они имеют один и тот же формат »):
Я думаю, вам понадобится что-то вроде диктонария кодов стран и городов. потому что у каждого из них может быть разная длина. США +1, Германия +49, даже +6723. То же самое с ареакодами...
Очень сложная проблема. Сначала нужно определить код страны. В зависимости от кода страны, остальную часть нужно разделить на код города и местный номер. Но ни одна из трех частей не имеет фиксированной длины, ни номер ямы, ни комбинация кода города и местной части!
Пример: 4930123456789
Пример: 493328123456
Пример: 34971123456
Не ведите собственную таблицу всех этих данных! Используйте библиотеку Java International Phone Number Utilities v3.0, https://github.com/googlei18n/libphonenumber . Это то, что использует Google, и Google поддерживает это для вас!