2011-12-19 15 views
6

Tengo la siguiente expresión que puede verse así (la cantidad de Sqrt [XXX] es desconocido)Cómo convertir varios "Sqrt [texto dentro]" en varios Sqrt (texto dentro), me refiero a [] en()

Sqrt[A+B] + Sqrt[Min[A,B]] * Min[Sqrt[C],D] 

y quiero convertir todo en Sqrt[XXX]Sqrt(XXX), quiero reemplazar los soportes del []Sqrt en () soportes

por lo que el ejemplo anterior se verá como

Sqrt(A+B) + Sqrt(Min[A,B]) * Min[Sqrt(C),D]

Yo no quiero "daño" los otros [] paréntesis en la expresión (como los que junto a Min)

¿Cómo puedo hacerlo con expresiones regulares?

+4

Usted no puede hacerlo con expresiones regulares, consulte respuesta aceptada aquí http://stackoverflow.com/questions/5475804/regular-expression-for-math-operations-with-parentheses –

+0

@MK temo con retrocediendo en general, podría (la diferencia entre RE sensibles y el lío que tenemos ahora gracias a perl ~). Pero estoy de acuerdo en que no es el camino a seguir. – Voo

+0

@Voo Estoy bastante seguro de que ni siquiera puedes retroceder. –

Respuesta

3

Puede hacerlo utilizando la iteración sobre los caracteres en la Cadena. Primero busque el índice de Sqrt[ y luego busque el soporte de cierre correspondiente.

Aquí hay un código de ejemplo:

final String s = "Sqrt[A+B] + Sqrt[Min[A,B]] * Min[Sqrt[C],D]"; 
final char[] charArray = s.toCharArray(); 

int index = s.indexOf("Sqrt["); 
while (index != -1) { 
    final int open = index + 4; 
    charArray[open] = '('; 

    // look for closing bracket 
    int close; 
    int matching = 0; 
    for (close = open + 1; close < charArray.length; close++) { 
     char c = charArray[close]; 
     if (c == ']') { 
      if (matching == 0) { 
       break; 
      } 
      matching--; 
     } else if (c == '[') { 
      matching++; 
     } 
    } 
    charArray[close] = ')'; 
    index = s.indexOf("Sqrt[", index + 1); 
} 
System.out.println(new String(charArray)); 

No he probado correctamente, así que por favor.

+0

(+1) No he intentado probar el código, pero creo que este tipo de enfoque es más adecuado para el problema que el uso de expresiones regulares. – NPE

+0

Sí, eso debería funcionar, aunque uno realmente debería agregar un caso de prueba con 'Sqrt [A + Sqrt [A]]' también. Pero eso debería funcionar también sin problemas. – Voo

+0

funciona en Sqrt [A + Sqrt [A]], :) – Daniel

1

Usando el formato dado de la cadena fuente, puede hacerlo con 3 expresiones regulares. El truco aquí es "cambiar el nombre" de los corchetes que pertenecen a la función Min y restaurarlos más adelante. Haría algo como:

s/Min\[([^[]+)\]/Min\{$1\}/g; 
s/Qsrt\[([^[]+)\]/Sqrt\($1\)/g; 
s/Min\{([^{]+)\}/Min\[$1\]}/g; 

Para el caso general, un analizador sería el camino a seguir. Para casos especiales como este, usar un truco podría funcionar :-).

+0

¿Alguna posibilidad de mostrar este "cambio de nombre" regular que se hace en Java? solo un fragmento ... – Daniel

Cuestiones relacionadas