Проверка номера телефона Android

Как проверить, действителен ли номер телефона? Длина до 13 (включая символ + впереди).

Как я могу это сделать?

Я пробовал это:

String regexStr = "^[0-9]$";

String number=entered_number.getText().toString();  

if(entered_number.getText().toString().length()<10 || number.length()>13 || number.matches(regexStr)==false  ) {
    Toast.makeText(MyDialog.this,"Please enter "+"\n"+" valid phone number",Toast.LENGTH_SHORT).show();
    // am_checked=0;
}`

И я также пробовал это:

public boolean isValidPhoneNumber(String number)
{
     for (char c : number.toCharArray())
     {
         if (!VALID_CHARS.contains(c))
         {
            return false;
         }
     }
     // All characters were valid
     return true;
}

Оба не работают.

Тип ввода: + sign to be accepted and from 0-9 numbers and length b/w 10-13 and should not accept other characters


person Udaykiran    schedule 15.06.2011    source источник
comment
Я думаю, вы получите ответ отсюда. stackoverflow.com/a/22505377/7329597   -  person Sejal Baraiya    schedule 26.10.2017


Ответы (14)


Учитывая указанные вами правила:

до длины 13, включая символ + впереди.

(а также включить минимальную длину 10 в ваш код)

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

^\+[0-9]{10,13}$

С минимальной и максимальной длинами, закодированными в регулярном выражении, вы можете удалить эти условия из своего блока if().

Не по теме: я бы предположил, что диапазон от 10 до 13 слишком ограничен для поля международного номера телефона; вы почти наверняка найдете действительные числа, которые и длиннее, и короче, чем это. Я бы предложил диапазон 8-20, чтобы быть в безопасности.

[EDIT] OP заявляет, что указанное выше регулярное выражение не работает из-за escape-последовательности. Не уверен, почему, но альтернативой может быть:

^[+][0-9]{10,13}$

[EDIT 2] OP теперь добавляет, что знак + должен быть необязательным. В этом случае регулярному выражению нужен вопросительный знак после +, поэтому приведенный выше пример теперь будет выглядеть так:

^[+]?[0-9]{10,13}$
person Spudley    schedule 15.06.2011
comment
косая черта, чтобы избежать знака плюс. Его нужно экранировать, так как это зарезервированный символ регулярного выражения. Это единственная escape-последовательность в регулярном выражении, поэтому я не знаю, почему она будет жаловаться. Но вы можете попробовать заменить \+ на [+]; это тоже должно работать. - person Spudley; 15.06.2011
comment
Он также принимает другие специальные символы... используется wen ^/+[0-9]{10,13}$ - person Udaykiran; 15.06.2011
comment
косая черта неверна; Я указал обратную косую черту. Но попробуйте альтернативную строку, которую я предложил. - person Spudley; 15.06.2011
comment
Это не работает, сэр... оно также принимает другие символы, но мне нужны числа 0-9, длина 10-13 и включая только знак + .. я использовал ^[+][0-9]{10,13}$ - person Udaykiran; 15.06.2011
comment
Приведенное выше регулярное выражение верно. Каких еще персонажей он пропускает? Вы проверили значение number.matches(regexStr)? Если это не ложь, то что? Изменится ли оно, если вы введете допустимое значение? - person Spudley; 15.06.2011
comment
Если я ввожу 9347474324 - ложь (неправильно) () 12#7456666 - ложь (правильно) +919347474324 - правда (правильно), это означает, что + является необязательным, если его там также следует принять. Но ее не пропускает в жировики мы не входим +. - person Udaykiran; 15.06.2011
comment
вы не указали, что хотите сделать знак плюс необязательным. Если это то, что вы хотите, вам просто нужно поставить вопросительный знак после него в регулярном выражении. Я снова отредактирую ответ.... - person Spudley; 15.06.2011
comment
Спасибо... но я не разрешаю, когда (number.matches(regexStr)==false && number.matches(regexStrsecond)==false) здесь regexStr = ^[+][0-9]{10,13}$; и regexStrsecond = ^[0-9]{10,13}$; это будет работать правильно? - person Udaykiran; 15.06.2011
comment
нет, вам нужно только одно регулярное выражение: вопросительный знак делает + необязательным. Смотрите мое последнее редактирование ответа. - person Spudley; 15.06.2011
comment
Это работает хорошо для меня. Спасибо .. Но я использовал подход Pattern.matcher и Pattern.compile(), которые проще в использовании. - person YuDroid; 16.05.2012
comment
каким будет регулярное выражение только для 10 цифр без +91? - person hitesh141; 29.06.2015
comment
Сама обратная косая черта должна быть экранирована, потому что она уже имеет особое значение в качестве escape-символа для строк Java. Таким образом, правильное регулярное выражение Java будет ^\\+[0-9]{10,13}$. - person Ionoclast Brigham; 29.08.2015

Используйте isGlobalPhoneNumber() метод PhoneNumberUtils, чтобы определить, является ли номер действительным номером телефона или нет.

Пример

System.out.println("....g1..."+PhoneNumberUtils.isGlobalPhoneNumber("+912012185234"));
System.out.println("....g2..."+PhoneNumberUtils.isGlobalPhoneNumber("120121852f4"));

Результат первого оператора печати — истина, а результат второго — ложь, поскольку второй номер телефона содержит f.

person Sunil Kumar Sahoo    schedule 15.06.2011
comment
Это НАМНОГО лучший ответ, чем другие! - person user123321; 12.11.2011
comment
Я использую (!PhoneNumberUtils.isGlobalPhoneNumber(1234)), а затем также воспринимаю его как действительный номер. Где на самом деле его нет. Что я должен делать? - person YuDroid; 16.05.2012
comment
@YuDroid, вам нужно указать «Действительный» номер. Чтобы кто-то помог тебе. Или задайте другой вопрос. - person Chris.Jenkins; 03.04.2013
comment
Обратите внимание, что isGlobalPhoneNumber вернет false для таких форматов, как (123) 456-7890 (тогда как 123-456-7890 вернет true) - person PVS; 10.05.2013
comment
Номера телефонов, содержащие *, также возвращаются как недействительные. - person Muzikant; 04.12.2013
comment
Не работает для Индии +919953617447 или 9953617447 или +91-9953617447 .. думал, ты должен знать - person Karan; 08.05.2015
comment
Не работает! Возвращает true для местного номера 0503701329. Действительно ненадежное решение. - person Leo Droidcoder; 20.12.2017
comment
Этот метод не надежен. Он возвращает true для чисел, содержащих * и даже 53123123. - person Taslim Oseni; 04.01.2018
comment
Метод не надежный - person D2TheC; 27.02.2018
comment
Всегда сначала запускайте PhoneNumberUtils.stripSeparators(), чтобы получить только + и цифры - person JamisonMan111; 24.05.2018
comment
Я не рекомендую это. Он говорит, что 1 является действительным глобальным номером телефона - person behelit; 21.01.2019

Чтобы проверить номера телефонов для определенного региона в Android, используйте libPhoneNumber от Google и следующий код в качестве примера:

public boolean isPhoneNumberValid(String phoneNumber, String countryCode)
{
    //NOTE: This should probably be a member variable.
    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();

    try 
    {
        PhoneNumber numberProto = phoneUtil.parse(phoneNumber, countryCode);
        return phoneUtil.isValidNumber(numberProto);
    } 
    catch (NumberParseException e) 
    {
        System.err.println("NumberParseException was thrown: " + e.toString());
    }

    return false;
}
person DiscDev    schedule 17.03.2015
comment
Вы также можете сделать phoneUtil.parse(phonePrefix + phoneNumber, null), если у вас нет региона. - person Andrew; 30.12.2016
comment
Это должен быть принятый ответ. Я попытался проверить телефонные номера для двух стран, и он обнаружил, что они неправильные и действительные. В то время как другие ответы показывались действительными, если я ввожу код страны + хотя бы одну дополнительную цифру - person JustADev; 25.04.2017
comment
Также убедитесь, что число, которое вы проверяете, начинается с «+». - person Leo Droidcoder; 20.12.2017
comment
Обратите внимание, что PhoneNumberUtils может устареть. то есть новые номера добавляются к операторам связи время от времени, поэтому PhoneNumberUtils продолжает сообщать о них как о недействительных, хотя на самом деле они теперь действительны. В идеале вы должны обновить зависимость после добавления новых номеров, но для этого требуется обновление приложения, поэтому вы можете блокировать пользователей до тех пор, пока это не произойдет. - person behelit; 17.03.2019
comment
Как вы вообще интегрируете эту библиотеку? - person TheRealChx101; 29.09.2019
comment
@ TheRealChx101 этому ответу более 4 лет, и мы перестали использовать эту библиотеку много лет назад. Я не помню подробностей. Вероятно, это была какая-то зависимость gradle. - person DiscDev; 29.09.2019
comment
Спасибо. Я смог понять это. - person TheRealChx101; 30.09.2019
comment
Чтобы интегрировать эту библиотеку, вставьте implementation group: 'com.googlecode.libphonenumber', name: 'libphonenumber', version: '8.4.2' в свой Gradle. - person Hawklike; 25.01.2020

Вы можете использовать встроенный в Android Patterns:

public boolean validCellPhone(String number)
{
    return android.util.Patterns.PHONE.matcher(number).matches();
}

Этот шаблон предназначен для поиска вещей, которые выглядят так, как будто они могут быть номерами телефонов в произвольном тексте, а не для проверки того, действительно ли что-то является номером телефона. Он пропустит многие вещи, которые являются законными телефонными номерами.

Шаблон соответствует следующему:

  • Необязательно, знак +, за которым сразу следует одна или несколько цифр. Могут следовать пробелы, точки или тире.
  • Необязательно набор цифр в круглых скобках, разделенных пробелами, точками или тире.
  • Строка, начинающаяся и заканчивающаяся цифрой, содержащая цифры, пробелы, точки и/или тире.
person RazaHameed    schedule 15.05.2014

вы также можете проверить проверку номера телефона как

     /**
     * Validation of Phone Number
     */
    public final static boolean isValidPhoneNumber(CharSequence target) {
        if (target == null || target.length() < 6 || target.length() > 13) {
            return false;
        } else {
            return android.util.Patterns.PHONE.matcher(target).matches();
        }

    }
person TejaDroid    schedule 17.07.2015
comment
Не используйте шаблон PHONE сам по себе: этот шаблон предназначен для поиска вещей, которые выглядят так, как будто они могут быть номерами телефонов в произвольном тексте, а не для проверки того, действительно ли что-то является номером телефона. - person nasch; 06.12.2017

Вы можете использовать PhoneNumberUtils, если формат вашего телефона соответствует одному из описанных форматов. Если ни одна из служебных функций не соответствует вашим потребностям, используйте обычные выражения.

person inazaruk    schedule 15.06.2011
comment
Кроме того, есть несколько методов, доступных из PhoneNumberUtils, но у меня сработал PhoneNumberUtils.formatNumberToE164(input, "PT"), где я указываю тип Locale для Португалии, но также может быть общим. - person Wahib Ul Haq; 03.06.2018

Мы можем использовать шаблон для его проверки.

android.util.Patterns.PHONE

public class GeneralUtils {

    private static boolean isValidPhoneNumber(String phoneNumber) {
        return !TextUtils.isEmpty(phoneNumber) && android.util.Patterns.PHONE.matcher(phoneNumber).matches();
    }

}
person LLIAJLbHOu    schedule 19.10.2016
comment
PHONE This pattern is intended for searching for things that look like they might be phone numbers in arbitrary text, not for validating whether something is in fact a phone number. developer.android.com/reference/android/util/ - person Eduards Denisjonoks; 29.03.2018

^\+?\(?[0-9]{1,3}\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})?

Проверьте свои случаи здесь: https://regex101.com/r/DuYT9f/1

person Maxim Firsoff    schedule 10.01.2018
comment
Хотя это может ответить на вопрос, лучше включить некоторый контекст/объяснение кода, потому что это делает его гораздо более полезным для будущих читателей. Поскольку на этот вопрос уже есть принятый ответ и несколько ответов, за которые проголосовали, вы также можете объяснить, чем ответ отличается от других / улучшается по сравнению с другими. - person EJoshuaS - Reinstate Monica; 10.01.2018

^\+201[0|1|2|5][0-9]{8}

это регулярное выражение соответствует египетским мобильным номерам

person mxml    schedule 26.06.2019

Вот как вы можете сделать это лаконично в Котлине:

fun String.isPhoneNumber() =
            length in 4..10 && all { it.isDigit() }
person Gulzar Bhat    schedule 09.08.2018
comment
Это красивый и лаконичный код, однако он не является комплексной проверкой валидности телефонного номера в целом. См. здесь: github.com/googlei18n/libphonenumber/blob/master/FALSEHOODS.md - person Peter F; 02.04.2019

У меня есть лучшее решение для проверки международного телефонного номера, и выбор кода страны ниже библиотеки оправдывает меня Лучшая библиотека для всех пользовательских интерфейсов и функций CountryCodePickerProject

person Venkatesh    schedule 29.03.2019

Как насчет этого метода:

private static boolean validatePhoneNumber(String phoneNumber) {
    // validate phone numbers of format "1234567890"
    if (phoneNumber.matches("\\d{10}"))
        return true;
        // validating phone number with -, . or spaces
    else if (phoneNumber.matches("\\d{3}[-\\.\\s]\\d{3}[-\\.\\s]\\d{4}"))
        return true;
        // validating phone number with extension length from 3 to 5
    else if (phoneNumber.matches("\\d{3}-\\d{3}-\\d{4}\\s(x|(ext))\\d{3,5}"))
        return true;
        // validating phone number where area code is in braces ()
    else if (phoneNumber.matches("\\(\\d{3}\\)-\\d{3}-\\d{4}"))
        return true;
        // Validation for India numbers
    else if (phoneNumber.matches("\\d{4}[-\\.\\s]\\d{3}[-\\.\\s]\\d{3}"))
        return true;
    else if (phoneNumber.matches("\\(\\d{5}\\)-\\d{3}-\\d{3}"))
        return true;

    else if (phoneNumber.matches("\\(\\d{4}\\)-\\d{3}-\\d{3}"))
        return true;
        // return false if nothing matches the input
    else
        return false;
}

  System.out.println("Validation for 1234567890 : " + validatePhoneNumber("1234567890"));
  System.out.println("Validation for 1234 567 890 : " + validatePhoneNumber("1234 567 890")); 
  System.out.println("Validation for 123 456 7890 : " + validatePhoneNumber("123 456 7890"));
  System.out.println("Validation for 123-567-8905 : " + validatePhoneNumber("123-567-8905"));
  System.out.println("Validation for 9866767545 : " + validatePhoneNumber("9866767545"));
  System.out.println("Validation for 123-456-7890 ext9876 : " + validatePhoneNumber("123-456-7890 ext9876"));

И выходы:

Validation for 1234567890 : true
Validation for 1234 567 890 : true
Validation for 123 456 7890 : true
Validation for 123-567-8905 : true
Validation for 9866767545 : true
Validation for 123-456-7890 ext9876 : true

Для получения дополнительной информации перейдите по этой ссылке.

person abbas jafary    schedule 10.03.2021

Вы не должны использовать регулярные выражения при проверке телефонных номеров. Проверьте этот JSON API — numverify.com — он бесплатный для нунвера, если звонит в месяц и может проверить любой номер телефона. Кроме того, каждый запрос содержит информацию о местоположении, типе линии и операторе связи.

person Jess    schedule 03.10.2015

person    schedule
comment
Хорошее объяснение каждой части блока Узора. Это должен быть принятый ответ. - person ralphgabb; 18.05.2020