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

#java #regex

#java #регулярное выражение

Вопрос:

Несколько дней назад я начал возиться с регулярным выражением, и сегодня меня попросили создать быстрое регулярное выражение. (Действительно ли создание эффективных регулярных выражений — это искусство?)

Итак, я написал это простое регулярное выражение, чтобы соответствовать израильскому номеру телефона: ^05[23489]-?[d]{3}-?[d]{4}$ Но выполнит ли оно задачу, которая заключается в завершении проверки около 10 000 телефонных номеров в течение 1 или 2 секунд? У меня здесь нет компьютера, поэтому я не могу проверить. Спасибо за любые улучшения!

Правила соответствия:

  • Начинается с 05, затем один из: 0, 2, 3, 4, 8, 9
  • затем необязательный дефис
  • затем 3 цифры
  • тогда необязательно ‘-‘
  • В конечном итоге получается 4 цифры.

Несколько примеров действительных телефонных номеров:

  1. 052-587-6549
  2. 0531432941
  3. 058-3219321
  4. 059-321-1353

Комментарии:

1. Но действительно ли этого достаточно, чтобы проверить около 10 000 телефонных номеров за 1 или 2 секунды? : вы пробовали? Что произошло?

2. Можете ли вы указать несколько действительных и недействительных телефонных номеров, которые мы могли бы использовать для проверки скорости?

3. о, я забыл упомянуть, что у меня сейчас нет компьютера, и эта миссия срочная.. нет, я не пробовал.

4. Ах, так ты пишешь это сообщение на… пишущая машинка? Вот интерактивная среда IDE, которую вы можете использовать даже на своем телефоне. ideone.com

5. lol нет, я с моего телефона o.O спасибо за сайт, я проверю случайные телефонные номера и обновлю сообщение соответственно результату.

Ответ №1:

[23489] Не включает 0 . Кроме того, не стоит заключать single d в скобки символьного класса, [d] = d .

Используйте

 ^05[023489]-?d{3}-?d{4}$
    ^
  

Смотрите демонстрацию регулярных выражений.

В Java вам не нужны ^ $ привязки и, если вы используете шаблон с .matches() методом, поскольку для этого требуется полное совпадение строк.

 if (phone.matches("05[023489]-?\d{3}-?\d{4}")) {
    // This is valid
}