Bem, simplesmente, [0-9]*
corresponde cadeias que consistem inteiramente de zero ou mais dígitos, incluindo strings vazias. Qualquer coisa que corresponda a uma string vazia, coincide com quaisquer dois caracteres, de modo que a substituição @
seja adicionada entre todas as letras na entrada. Strings de vários dígitos são substituídas por um @
, pois a expressão corresponde a todos os dígitos consecutivos de uma vez.
Portanto, na string de entrada ab43
, as correspondências para [0-9]+
são (com alguns espaços em branco adicionados para maior clareza):
a b 434
^ ^ ^^^- here, a string of some digits
^ ^- here, a zero-length string
^- here, a zero-length string
Use [0-9]
para corresponder exatamente a um dígito ou [0-9][0-9]*
para corresponder a um ou mais (ou [0-9]+
em expressões regulares estendidas).