"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué \"test\".replaceAll(\".\", \"a\") da como resultado \"aa\" en Java?

¿Por qué \"test\".replaceAll(\".\", \"a\") da como resultado \"aa\" en Java?

Publicado el 2024-11-10
Navegar:286

Why Does \

Anomalía de Reemplazo de Cadenas: Doble Reemplazo con ".*"

En Java, el método String.replaceAll() realiza una búsqueda global y operación de reemplazo en una cadena determinada usando una expresión regular. Sin embargo, surge un comportamiento inesperado al utilizar el patrón de expresión regular ".*", lo que genera un problema de reemplazo doble.

La pregunta plantea un escenario en el que "test".replaceAll(".", "a ") produce "aa" como resultado. Esto se debe a que . es un cuantificador codicioso que coincide con cualquier número de caracteres (incluido el cero), capturando inicialmente la cadena de entrada completa. Como resultado, el primer reemplazo reemplaza toda la cadena con "a".

Sin embargo, . también puede coincidir con una cadena vacía. Después del reemplazo inicial, la cadena vacía que queda al final de la entrada también califica como una coincidencia para .. Por lo tanto, se produce un segundo reemplazo, reemplazando la cadena vacía con "a", lo que da como resultado el resultado final "aa".

Para evitar este problema de doble reemplazo, considere alternativas a .* como . , que requiere al menos un carácter para coincidir. Alternativamente, usar replaceFirst() solo reemplazará la primera aparición, evitando la situación en la que una cadena vacía coincide por segunda vez.

Curiosamente, algunos motores de expresiones regulares no exhiben este comportamiento de doble reemplazo. Por ejemplo, GNU sed considerará la entrada agotada después de la primera coincidencia, evitando más reemplazos. Sin embargo, es fundamental ser consciente de esta posible anomalía al utilizar ".*" con el método String.replaceAll() en Java.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3