Регулярные выражения Perl для соответствия хэшу MD5?
Недавно, программируя на PHP, я думал, что у меня есть работающее регулярное выражение Perl, но когда я сверил его с тем, что хотел, оно не сработало.
Какое правильное выражение для проверки, есть ли что-то в MD5 (32-значная шестнадцатеричная цифра a-z и 0-9).
В настоящее время у меня есть /^[a-z0-9]{32}$/i
6 answers
МД5:
/^[0-9a-f]{32}$/i
ША-1:
/^[0-9a-f]{40}$/i
MD5 или SHA-1:
/^[0-9a-f]{32}(?:[0-9a-f]{8})?$/i
Кроме того, большинство хэшей всегда представлены в шестнадцатеричном виде в нижнем регистре, поэтому вы можете рассмотреть возможность удаления модификатора i
.
Кстати, шестнадцатеричный означает основание 16:
0 1 2 3 4 5 6 7 8 9 A B C D E F = base 16
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 = base 10
Таким образом, как вы можете видеть, оно изменяется только от 0 до F, так же, как десятичное число (или основание 10) изменяется только от 0 до 9.
/^[a-f0-9]{32}$/i
Должно работать немного лучше, так как хэши MD5 обычно выражаются шестнадцатеричными числами.
Существует также класс символов POSIX xdigit
(см. perlreref):
/^[[:xdigit:]]{32}$/
Что ж, важным моментом для рассмотрения является тот факт, что $
может соответствовать \n
. Следовательно:
E:\> perl -e "$x = qq{1\n}; print qq{OK\n} if $x =~ /^1$/" OK
Упс!
Следовательно, правильный шаблон таков:
/^[[:xdigit:]]{32}\z/
Даже проще и быстрее, чем регулярное выражение, как рекомендовано PHP Функции Ctype :
function is_md5($s){ return (ctype_xdigit($s) and strlen($s)==32); }
@OP, возможно, вы захотите использовать /[a-f0-9]{32,40}/
, это может проверить длину, превышающую 32, например, сгенерированную из sha1.