Pues, no es que haya cambiando mucho:
0{8} ----- 8 ceros
(?: -------- En este caso cambia el sentido del paréntesis, en lugar de ser un grupo o subpatron que podamos obtener posteriormente sirve más bien como un... no sabrá decir una palabra que lo describa, ¿separador?
0[1-9a-f]|[1-9a-f]0 ------ Aquí está la gracia de lo que hicimos con el paréntesis, indicamos dos opciones al motor, 1) 0 seguido de un carácter de entre 1 y 9 o entre a y f. 2) un carácter de entre 1 y 9 o entre a y f seguido de un 0. Las dos opciones son separadas por el carácter |
El resto continúa más o menos como estaba
.