Как лучше частично подтвердить номер телефона, используя Java - PullRequest
1 голос
/ 11 марта 2020

Мне нужно подтвердить начало номера телефона, под этим я подразумеваю, что мне нужно убедиться, что указан код страны. Номер телефона должен начинаться со знака плюс, за которым следуют минимум 1 цифра и максимум 3 цифры, после которых ставится дефис.

Пример действительных чисел ...

+ 1-555 -5555

+ 12-5555555

+ 123- (555) 555-5555

Примеры неверных телефонных номеров

+ 1 (555) 555-5555

5555555555

+ 5555555555

Это то, что я имею до сих пор. Что я делаю, так это убираю все нецифровые цифры, чтобы убедиться, что у меня минимум 10 цифр. Затем я проверяю, что у меня есть код страны минимум из 3 цифр. После этого, если номер телефона не начинается с «+», я добавляю один.

private boolean isPhoneNumberValid(String phoneNumber) {
  if (!isPhoneNumberLengthValid(phoneNumber) || !isCountryCodeLenghtValid(phoneNumber)) {
    return false;
  }

  if (!phoneNumber.startsWith("+")) {
    request.getDestination().setMobilePhoneNumber("+" + phoneNumber);
  }

  return true;
}

private boolean isPhoneNumberLengthValid(String phoneNumber) {
  return phoneNumber.replaceAll("\\D+","").length() < 10;
}

private boolean isCountryCodeLenghtValid(String phoneNumber) {
  String countryCode = StringUtils.left(phoneNumber, phoneNumber.indexOf("-")).replaceAll("\\D+","");

  return countryCode.length() >= 1 && countryCode.length() <= 3;
}

Как лучше всего проверить код страны?

Ответы [ 4 ]

0 голосов
/ 12 марта 2020

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

public class Main {
    public static void main(String[] args) {
        String[] phoneNumbers = { "+1-555-5555", "+12-5555555", "+123-(555) 555-5555", "+1(555) 555-5555", "5555555555",
                "+5555555555" };
        for (String phoneNumber : phoneNumbers) {
            if (phoneNumber.matches("^[+][0-9]{1,3}[-][[(]{0,1}[0-9]+[-)\\s]{0,1}]*[0-9]{4}$")) {
                System.out.println(phoneNumber + " passed validation");
            } else {
                System.out.println(phoneNumber + " failed validation");
            }
        }
    }
}

Выход:

+1-555-5555 passed validation
+12-5555555 passed validation
+123-(555) 555-5555 passed validation
+1(555) 555-5555 failed validation
5555555555 failed validation
+5555555555 failed validation
0 голосов
/ 11 марта 2020

Попробуйте это.

  • начинается с +
  • , затем 1-3 цифр.
  • , затем -
  • затем anything.
    String[] tel = { "+1-555-5555",
                "+12-5555555",
                "+123-(555) 555-5555",
                "+1- 555-5555",
                "(555)555-5555",
                "+1 (555) 555-5555",
                "+12-(555) 555-555"};

        String pat =
                "\\+\\d{1,3}-.*";
        for (String s : tel) {
           System.out.printf("%20s -> %s%n", s, s.matches(pat) ? "good" : "bad");
        }
0 голосов
/ 12 марта 2020

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

^\+\d{1,3}-(?:\(\d{3}\)\h*)?\d{3}-?\d{4}$

Пояснение

  • ^ Начало строки
  • \+\d{1,3}-
  • (?: Группа без захвата
    • \(\d{3}\)\h* Совпадение (, 3 цифры, ) и 0+ горизонтальных пробельных символов
  • )? закрыть группу и сделать ее необязательной
  • \d{3}-?\d{4} Совпадение 3 цифр, необязательное - и 4 цифры
  • $ Конец строки

Regex demo | Java демо

In Java

String regex = "^\\+\\d{1,3}-(?:\\(\\d{3}\\)\\h*)?\\d{3}-?\\d{4}$";

Например

String strs[] = { 
        "+1-555-5555",
        "+12-5555555",
        "+123-(555) 555-5555",
        "+1(555) 555-5555",
        "5555555555",
        "+5555555555",
        "+123-)(----"
    };
String regex = "\\+\\d{1,3}-(?:\\(\\d{3}\\)\\h*)?\\d{3}-?\\d{4}";
for (String s : strs)
    System.out.printf("%s --> %s%n", s, s.matches(regex) ? "Match" : "No match");

Выход

+1-555-5555 --> Match
+12-5555555 --> Match
+123-(555) 555-5555 --> Match
+1(555) 555-5555 --> No match
5555555555 --> No match
+5555555555 --> No match
+123-)(---- --> No match
0 голосов
/ 11 марта 2020

Прежде всего я должен сказать, что обычно плохая идея требовать, чтобы телефонные номера соответствовали указанному формату c и длине, так как таким образом вы лишите законной силы множество действительных номеров, но я не знаю, как вы их используете case.

Несмотря на шутку Я бы использовал регулярные выражения:

\+\d{1,3}-[()\d\s-]+

Это регулярное выражение соответствует строкам, которые имеют

  • a буквальный плюс,
  • , за которым следуют 1-3 цифры
  • , затем дефис
  • , затем один или несколько символов в наборе скобок, цифр, пробелов или дефисов

Последняя категория может быть изменена, чтобы соответствовать вашим точным спецификациям.


import java.util.regex.Pattern;  

class PhoneNumber {
  protected static void checkNumber(String number) {
    System.out.println(number + " : " + (
      Pattern.matches("\\+\\d{1,3}[-][()\\d\\s-]+", number) 
        ? "valid" : "invalid"
      )
    );
  }

  public static void main(String[] args) {
    String number;
    checkNumber("+1-555-5555");
    checkNumber("+12-5555555");
    checkNumber("+123-(555) 555-5555");
    checkNumber("+1(555) 555-5555");
    checkNumber("5555555555");
    checkNumber("+5555555555");
  }
}

Это производит:

+1-555-5555 : valid
+12-5555555 : valid
+123-(555) 555-5555 : valid
+1(555) 555-5555 : invalid
5555555555 : invalid
+5555555555 : invalid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...