Avatar ·

Por que \d em C# é mais lento que [0-9]?

Olá a todos! Sou um desenvolvedor C# iniciante e me deparei com um problema inesperado ao otimizar expressões regulares. Tenho uma tarefa: verificar se uma string consiste apenas em dígitos. Escrevi duas variantes de regex: 1. `^\d+$` 2. `^[0-9]+$` Intuitivamente, parece que `\d` deveria ser mais rápido ou pelo menos tão rápido, já que é apenas uma abreviação para dígitos. Mas fiz um pequeno benchmark com `Stopwatch` em uma string de 1000 caracteres (1000 dígitos aleatórios) e obtive resultados chocantes: ``` \d: ~450 ticks [0-9]: ~120 ticks ``` Uma diferença de quase 4 vezes! Executei o teste 100 vezes para eliminar aleatoriedade. Os resultados são estáveis. Estou usando .NET 6, `Regex` padrão sem flags. Por que isso acontece? Afinal, tanto `\d` quanto `[0-9]` deveriam representar a mesma coisa — dígitos de 0 a 9. Será que estou medindo algo errado? Ou existem armadilhas com Unicode em C#? Por favor, me digam qual é o problema e como escrever regex corretamente para buscar dígitos.