"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que \"test\".replaceAll(\".\", \"a\") resulta em \"aa\" em Java?

Por que \"test\".replaceAll(\".\", \"a\") resulta em \"aa\" em Java?

Publicado em 2024-11-10
Navegar:626

Why Does \

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.

Tutorial mais recente Mais>

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