views:

434

answers:

5

Recently programming in PHP, I thought I had a working Perl regular expression but when I checked it against what I wanted, it didn't work.

What is the right expression to check if something is a MD5 has (32 digit hexadecimal of a-z and 0-9).

Currently, I have /^[a-z0-9]{32}$/i

+11  A: 
/^[a-f0-9]{32}$/i

Should work a bit better, since MD5 hashes usually are expressed as hexadecimal numbers.

Mikael S
+9  A: 

MD5:

/^[0-9a-f]{32}$/i

SHA-1:

/^[0-9a-f]{40}$/i

MD5 or SHA-1:

/^[0-9a-f]{32}(?:[0-9a-f]{8})?$/i

Also, most hashes are always presented in a lowercase hexadecimal way, so you might wanna consider dropping the i modifier.


By the way, hexadecimal means base 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

So as you can see it only goes from 0 to F, the same way decimal (or base 10) only goes from 0 to 9.

Alix Axel
You just saved me many painful google searches
Harry
A: 

@OP, you might want to use /[a-f0-9]{32,40}/ , this can check for length greater than 32, such as those generated from sha1.

ghostdog74
+8  A: 

There is also the POSIX character class xdigit (see perlreref):

/^[[:xdigit:]]{32}$/
toolic
+6  A: 

Well, an important point to consider is the fact that $ can match \n. Therefore:

E:\> perl -e "$x = qq{1\n}; print qq{OK\n} if $x =~ /^1$/"
OK

Ooops!

The correct pattern, therefore, is:

/^[[:xdigit:]]{32}\z/
Sinan Ünür