Sí, es exactamente lo mismo que se describe en this question!
.*
será el primer partido toda la entrada, pero entonces también una cadena vacía al final de la entrada ...
Vamos a simbolizar el motor de expresiones regulares con |
y la entrada con <...>
en su ejemplo.
- input:
<xyz>
;
- motor regex, antes de la primera ejecución:
<|xyz>
;
- motor regex, después de la primera ejecución:
<xyz|>
(texto coincidente: "xyz");
- motor regex, después de la segunda ejecución:
<xyz>|
(texto combinado: "").
No todos los motores regex se comportan de esta manera. Java lo hace, sin embargo. También lo hace Perl. Sed, como contraejemplo, posicionará su cursor después del final de la entrada en el paso 3.
Ahora, también tiene que entender una cosa crucial: los motores regex, cuando encuentran una coincidencia de longitud cero, siempre avanzan uno personaje. De lo contrario, considere lo que sucedería si intentara reemplazar '^' con 'a': '^' coincide con una posición, por lo tanto, es una coincidencia de longitud cero. Si el motor no avanzaba un carácter, "x" sería reemplazado por "ax", que sería reemplazado por "aax", etc. Por lo tanto, después de la segunda coincidencia, que está vacía, el motor de expresiones regulares de Java avanza un "carácter" "... De los cuales no hay ninguno: final del procesamiento.
¿Qué significa '" xyz ".replaceAll (". * "," X ")' return? – robert
@robert Devuelve '" xx "'. –
@JackEdmonds ¿Por qué '" xx "' y no '" xxx "'? – user219882