Упрощение длинного сложного регулярного выражения - PullRequest
0 голосов
/ 26 февраля 2020

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

Я должен проверить, что входы имеют правильный формат. Формат ввода может быть:

  1. AA:BB:CC DDD/EEE
  2. CC DDD/EEE

Не обращайте внимания на заглавные буквы. A, B, C и D могут быть буквой (в верхнем регистре или нет) или ди git.

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

([a-zA-Z0-9])*([:])?([a-zA-Z0-9])*([:])?([a-zA-Z0-9])+([ ]){1}([a-zA-Z0-9])+([/]){1}([a-zA-Z0-9])+

1 Ответ

1 голос
/ 26 февраля 2020
  • Если в [] s ввести только один символ, то [] s являются избыточными, поэтому [/] можно упростить до /, [:] можно упростить до : et c.

  • Вам также не нужно указывать, что что-то повторяется {1} время, поэтому их можно удалить.

  • 0-9 внутри [] s можно упростить до \d:

Применяя вышеизложенное, получим:

([a-zA-Z\d])*(:)?([a-zA-Z\d])*(:)?([a-zA-Z\d])+( )([a-zA-Z\d])+(/)([a-zA-Z\d])+
  • (:)? либо захватит :, либо ничего (null). Если вам это не нужно, вы можете удалить группу. Точно так же ( ) всегда будет захватывать пробел, который кажется совершенно бессмысленным.

  • ([a-zA-Z\d])* будет захватывать только последний повтор. Вы можете захотеть ([a-zA-Z\d]*) или не захватывать что-либо.

Если вы не хотите захватывать что-либо, следовательно, удалив все группы, мы получим:

[a-zA-Z\d]*:?[a-zA-Z\d]*:?[a-zA-Z\d]+ [a-zA-Z\d]+/[a-zA-Z\d]+

Последнее, но не менее важное:

  • В начале, [a-zA-Z\d]*:? повторяется дважды, мы можем использовать квантификатор {2}.

  • Если вы передаете опцию Pattern.CASE_INSENSITIVE в Pattern.compile, вам не нужно каждый раз указывать A-Z.

Теперь мы получаем:

([a-z\d]*:?){2}[a-z\d]+ [a-z\d]+/[a-z\d]+
...