Регулярное выражение не правильно очищает номер телефона

Код:

public class PhoneCleanerRegex {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);
while (true) {
  String input = scanner.nextLine();
  if (input.equals("0")) {
    scanner.close();
    break;
  }
  //TODO:напишите ваш код тут, результат вывести в консоль.
  input.replaceAll("^(\\+)[0123456]","");
  String regex = "(7|8)90(5|9)[0-9]{7,11}";
  String regex2 = "90(5|9)[0-9]{7,11}";
  String[] split = input.split("[0-9]");
  String number1 = split[0];
  if(input.matches(regex)){
    System.out.println(input);
  }else if (input.matches(regex2)){
    System.out.println("7"+input);
  }else if(number1 == "8"){
    input.replaceAll(number1,"7");
    System.out.println(input);
  }else {
    System.out.println("Неверный формат номера");
  }

}

Проблема:

Не могу корректно составить выражение что бы в начале строки символ "+" заменить на пустоту, также элементы в номерах +7 909 123-45-67;905-1234567;8-905-1234567;+7 (909) 1234567.


Ответы (1 шт):

Автор решения: Nowhere Man

Если нужно удалить нецифровые символы, достаточно использовать String::replaceAll с классом символов \D, однако, следует отметить, что этот метод возвращает новую строку, а не изменяет существующую, поэтому результат его вызова нужно (пере)присвоить какой-нибудь переменной.

Затем, судя по всему нужно проверять числа с определённым префиксом 7 или 8, после которого идут коды 905 или 909 и 7 цифр.

Также можно "нормализовать" номер телефона (заменить 8 или пустое место в начале номера цифрой 7):

  • "(7|8)?90(5|9)\\d{7}": необязательный префикс 7 или 8, после которого идёт код 905 или 909, а затем ровно 7 цифр.

  • cleanedInput.replaceFirst("^(8?)(90)", "7$2") -- заменяет 8 на 7 или вставляет 7 в уже проверенном валидном номере.

String input = scanner.nextLine();
// сразу удалить все нецифровые символы
String cleanedInput = input.replaceAll("\\D+", "");
if (cleanedInput.matches("(7|8)?90(5|9)\\d{7}")) {
    System.out.print("Valid phone number: " + input + " -> " + cleanedInput);
    cleanedInput = cleanedInput.replaceFirst("^(8?)(90)", "7$2");
    System.out.println(" -> " + cleanedInput);
} else {
    System.out.print("Invalid phone number: " + input);
}

Тесты:

// 905-1234567
Valid phone number: 905-1234567 -> 9051234567 -> 79051234567

// 8-905-1234567
Valid phone number: 8-905-1234567 -> 89051234567 -> 79051234567

// +7 (909) 1234567, replaceFirst не сработал
Valid phone number: +7 (909) 1234567 -> 79091234567 -> 79091234567

// 905-123456
Invalid phone number: 905-123456

// 7 (905)-12345678
Invalid phone number: 7 (905)-12345678
→ Ссылка