String ReplaceAll Anomaly: Dupla substituição com ".*"
Em Java, o método String.replaceAll() realiza uma pesquisa global e substitua a operação em uma determinada string usando uma expressão regular. No entanto, um comportamento inesperado surge ao usar o padrão regex ".*", levando a um problema de substituição dupla.
A questão apresenta um cenário onde "test".replaceAll(".", "a ") produz "aa" como resultado. Isso ocorre porque . é um quantificador ganancioso que corresponde a qualquer número de caracteres (incluindo zero), capturando inicialmente toda a string de entrada. Como resultado, a primeira substituição substitui a string inteira por "a."
No entanto, . também pode corresponder a uma string vazia. Após a substituição inicial, a string vazia restante no final da entrada também se qualifica como uma correspondência para .. Assim, ocorre uma segunda substituição, substituindo a string vazia por "a", resultando na saída final "aa."
Para evitar esse problema de substituição dupla, considere alternativas para .* como . , que requer pelo menos um caractere para corresponder. Alternativamente, usar replaceFirst() substituirá apenas a primeira ocorrência, evitando a situação em que uma string vazia é correspondida uma segunda vez.
Curiosamente, alguns mecanismos regex não exibem esse comportamento de substituição dupla. Por exemplo, GNU sed considerará a entrada esgotada após a primeira correspondência, evitando futuras substituições. No entanto, é crucial estar ciente desta potencial anomalia ao usar ".*" com o método String.replaceAll() em Java.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3