*
(\W|\b) coincide con límite de palabra o algo que no sea alfanumérico, que capturaremos en $1
*
(4\d|5[1-5]) o bien tenemos un '4' seguido de un dígito, o un '5' seguido de un dígito '1', '2', '3', '4' o '5', que capturaremos en $2
*
\d{2} seguido por dos dígitos más
*
([ \-]?) posiblemente seguido de un separador, que puede ser el espacio, o '\' o '-', que capturaremos en $3
*
\d{4} seguido de cuatro dígitos más
*
(\3\d{4}){2} seguido de un patrón repetido dos veces, consistente en el valor $3 (el separador) seguido de cuatro dígitos más, que capturaremos (uno de las repeticiones) en $4
*
(\W|\b) coincide con límite de palabra o algo que no sea alfanumérico, que capturaremos en $5
En resumen... está buscando números de tarjetas de crédito.
Actualización: hay un módulo en CPAN para esto:
Regexp::Common::CC. Sirve para las tarjetas Mastercard, Visa, Amex, Diners Club, Discover, enRoute y JCB.
Actualización 2: creo que quedaría mejor así:
Using perl Syntax Highlighting
(?:\W|\b)((?:4\d|5
[1
-5
])\d{2
}(\D?)\d{4
}(?:\
2\d{4
}){2
})(?:\W|\b)Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
quedando el número de la tarjeta de crédito en $1.