соответствующий номер телефона в регулярном выражении - PullRequest
1 голос
/ 15 февраля 2011
[1-9]\\d{2}-[1-9]\\d{2}-\\d{4}

Что делает [1-9]? это как определенный диапазон целых чисел? Я пробовал 194-333-1111, но не проверял.

Это тривиальные вопросы, но они заняли у меня час и до сих пор не могут понять.

Любая помощь приветствуется !!! Спасибо


Редактировать

if (phone.matches("[1-9]\\d{2}-[1-9]\\d{2}-\\d{4}"))
  System.out.println("Invalid phone number");
else
  System.out.println("Valid input. Thank you.");

Ответы [ 5 ]

3 голосов
/ 15 февраля 2011

[1-9] соответствует диапазону символов от 1 до 9 включительно.

Где вы проверяли выражение, потому что оно соответствует вашей целевой строке.Однако косые черты экранированы, как и должно быть при вводе на разных языках программирования.Возможно, вы протестировали выражение с помощью приложения, которое выполнит экранирование для вас.

РЕДАКТИРОВАТЬ для кода:

Ваши сообщения об ошибках изменены.matches() возвращает истину, когда строка допустима, но вы печатаете, что она недопустима в истинной части оператора if else.

2 голосов
/ 15 февраля 2011

Ниже приведено разбиение регулярного выражения:

[1-9] // Starts with a digit other than 0
\d{2} // and followed by any two digits
- // and followed by -
[1-9] // and followed a digit other than 0
\d{2} // and followed by any two digits
- // and followed by -
\d{4} // and followed by any four digits 

194-333-1111 соответствует приведенному выше регулярному выражению.Возможно, проблема связана с экранирующим символом.

Например:

public static void RegexTest()
    {
            Pattern p = Pattern.compile("[1-9]\\d{2}-[1-9]\\d{2}-\\d{4}");
            Matcher m = p.matcher("194-333-1111");
            boolean b = m.matches();
          System.out.println(b);

    }
1 голос
/ 15 февраля 2011

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

1 голос
/ 15 февраля 2011

Ваше регулярное выражение, как оно написано, вероятно, не будет делать то, что вы хотите. Вам нужно сначала убрать обратную косую черту. Например, в Perl вы бы использовали его как:

if ($number =~ /[1-9]\d{2}-[1-9]\d{2}-\d{4}/) {
  print "matches!\n";
}

Ваше регулярное выражение будет разбиваться следующим образом:

/[1-9]    # Match exactly one of the numbers 1 through 9
 \d{2}    # Match exactly two digits
 -        # Match exactly one dash
 [1-9]    # Match exactly one of the numbers 1 through 9
 \d{2}    # Match exactly two digits
 -        # Match exactly one dash
 \d{4}    # Match exactly four digits
/x

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

/[1-9]  # Match exactly one of the numbers 1 through 9
 \\     # Match exactly one \
 d{2}   # Match exactly two 'd's
 -      # Match exactly one dash
 [1-9]  # Match exactly one of the numbers 1 through 9
 \\     # Match exactly one \
 d{2}   # Match exactly two 'd's
 -      # Match exactly one dash
 \\     # Match exactly one \
 d{4}   # Match exactly four 'd's
/x

Видите, как сильно отличается двойная обратная косая черта?

1 голос
/ 15 февраля 2011

[1-9] соответствует любой цифре от 1 до 9

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...