2009-02-03 9 views

Respuesta

21

'*' significa cero o más coincidencias del carácter anterior. Entonces, cada cadena vacía será reemplazada por una "e".

Es posible que desee utilizar '+' en lugar:

replaceAll("B+", "e")

+0

99% derecho ... es una búsqueda codiciosa, por lo que si puede coincidir con "B", lo hará. De lo contrario, la salida habría sido "eee1e2e3e" – user54650

+0

Eso no explica el ':' en la salida, aunque ... – luiscubal

+0

El ':' es probablemente un error de copiar y pegar, el código proporcionado no puede producir un ' : '... –

7

desea que esta para su patrón:

B+ 

Y su código sería:

String result = "B123".replaceAll("B+","e"); 
System.out.println(result); 

El "*" coincide con "cero o más" - y "cero" incluye el nada que está antes de la B, así como entre todos los demás caracteres.

+0

Whups, gracias Paul! : D –

+0

En el primer intento, la expresión regular consume la 'B', no una cadena vacía. Luego coincide con la cadena vacía en cada posición, comenzando en la posición donde la primera coincidencia se detuvo. –

1

Pasé más de un mes trabajando en una gran compañía tecnológica solucionando un error con * (splat!) En expresiones regulares. Mantuvimos un sistema operativo UNIX poco conocido. Mi cabeza casi explotó porque coincide con CERO apariciones de un encuentro con un personaje. Habla sobre un error difícil de entender a través de tu propia recrea. Estábamos sustituyendo por partida doble en algunos casos. No pude entender por qué el código era incorrecto, pero pude agregar un código que captó el caso especial (incorrecto) e impidió el doble ocultamiento y no rompió ninguna de las utilidades que lo incluían (incluidos sed y awk). Estaba orgulloso de haber solucionado este error, pero como ya se mencionó.

Por el amor de Dios, solo use + !!!!

+0

Sí, ese doble partido es bastante extraño. Me tiró un par de veces antes de aprender a mirarlo. Y un +1 para usar siempre + en lugar de * si puede. –

Cuestiones relacionadas