Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Reemplazo de caracteres especiales

Hola a todos, soy nuevo por aquí. Les planteo mi problema...
Estoy haciendo un programa que coge reacciones químicas de este estilo:
"+ 1.0000 Mg+++ + 2.0000 Cl- + 6.0000 H2O"
(coge la cadena completa).
Donde pone "Mg+++" debería de poner "Mg+3" (las dos nomenclaturas son correctas, pero para lo que estoy haciendo necesito la segunda).

Puedo tener 3 signos "+" (como en este ejemplo), o incluso hasta 9 (que se traduciría en un "+9"). Pues bien, estoy haciendo un programa para intentar cambiar estas cadenas tal y como quiero.

Para hacerlo, he construido unos bucles que construyen la cadena de caracteres de signos "+" : la primera cadena de 9 signos seguidos, y disminuyendo hasta la ultima cadena de 2. Daría el siguiente resultado:

+++++++++
++++++++
+++++++
++++++
+++++
++++
+++
++

Cada cadena la busco en la reacción y la sustituyo según sea el caso utilizando un replaceAll(). El problema es que al ser el signo "+" un caracter especial, no me deja hacer este cambio.

Como podria solucionar este problema? Aqui les dejo el codigo:

String linea="+ 1.0000 Mg+++++ + 2.0000 Cl- + 6.0000 H2O";
String saux1="";
String saux2="";

int i;
int j;

for(i=9;i>1;i--){
saux1="";
for(j=0;j<i;j++){
saux1=saux1+"+"; //Cadena de signos. Primera cadena: "+++++++++"
}
saux2="+"+Integer.toString(j); //Cadena resultado. Para el primer caso: "+9"
linea.replaceAll(saux1,saux2); //Intento sustituir "+++++++++" por "+9".
}

PD: He intentado construir la cadena saux1 en el segundo bucle como saux1=saux1+"\\+". En ese caso compila, pero no hace el cambio...no se ya que hacer!

Gracias de antemano!

julio 22, 2014 | Registered Commenterdarkonl

He aquí el Error:

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0
+++++++++
^
at java.util.regex.Pattern.error(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.lang.String.replaceAll(Unknown Source)
at pruebaReactivos.separarReactivos.main(separarReactivos.java:19)

julio 22, 2014 | Registered Commenterdarkonl

Guenas.

Prueba esto

String linea = "+ 1.0000 Mg+++++ + Ca+++ + 2.0000 Cl- + 6.0000 H2O";
String saux1 = "";
String saux2 = "";

int i;
int j;

for (i = 9; i > 1; i--) {
saux1 = "";
for (j = 0; j

julio 22, 2014 | Unregistered CommenterPaposo

Joder, lo corta
A ver si al menos escribe el cachito importante

String res=linea.replaceAll(saux1, saux2);
if(!res.equals(linea)) {
linea=res;
}

julio 22, 2014 | Unregistered CommenterPaposo

Lo acabo de solucionar! Venia a postearlo y vi tu respuesta. Al final tu solución da el mismo error, no se escapa del truco...jeje (a mi no se me habia ocurrido).

Solucion: he utilizado replace() en lugar de replaceAll().

for(i=9;i>1;i--){
saux1="";
for(j=0;j<i;j++){
saux1+="+";
}
saux2="+"+Integer.toString(j);
saux3=linea.replace(saux1,saux2);
System.out.println("Cambio :"+saux3);
linea=saux3;
}

julio 22, 2014 | Registered Commenterdarkonl

Igualmente, no entiendo por qué replace() funciona y replaceAll() no!
replaceAll() utiliza el "+" y replace() no?

julio 22, 2014 | Registered Commenterdarkonl

Guenas.

Pues no se. Yo probé tu primer intento con "\\+" y no petaba.
No hacia lo que debía porque faltaba la asignación, pero para el resto hacían lo mismo.

Un saludo

julio 22, 2014 | Unregistered CommenterPaposo