2011-12-19 9 views
6

Ho ottenuto la seguente espressione che può apparire come questa (la quantità di Sqrt [XXX] è sconosciuto)Come girare diversi "Sqrt [del testo dentro]" in diversi Sqrt (alcuni testi all'interno), intendo da [] a()

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

e voglio trasformare tutto in Sqrt[XXX]Sqrt(XXX), voglio sostituire le [] parentesi della Sqrt in () parentesi

quindi l'esempio di cui sopra sarà simile

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

Non voglio a "ferire" gli altri [] parentesi nell'espressione (come quelli accanto a Min)

Come posso farlo con regex?

+4

Non è possibile farlo con le espressioni regolari, vedi risposta accettata qui http://stackoverflow.com/questions/5475804/regular-expression-for-math-operations-with-parentheses –

+0

@MK temo con backtracking in genere poteva (la differenza tra RE sensibili e il casino che abbiamo ora grazie a perl ~). Ma sono d'accordo che non è la strada da percorrere. – Voo

+0

@Voo Sono abbastanza sicuro che non puoi nemmeno tornare indietro. –

risposta

3

È possibile eseguire questa operazione utilizzando l'iterazione sui caratteri nella stringa. Prima cerca l'indice di Sqrt[ e cerca la parentesi di chiusura corrispondente.

Ecco alcuni esempi di codice:

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)); 

non ho ancora testato in modo corretto, quindi per favore.

+0

(+1) Non ho provato a testare il codice, ma penso che questo tipo di approccio sia più adatto al problema che usare l'espressione regolare. – NPE

+0

Sì, che dovrebbe funzionare, anche se si dovrebbe davvero aggiungere una testcase con 'Sqrt [A + Sqrt [A]]' pure. Ma dovrebbe funzionare anche senza problemi. – Voo

+0

funziona su Sqrt [A + Sqrt [A]], :) – Daniel

1

Utilizzando il formato specificato della stringa di origine, è possibile farlo con 3 espressioni regolari. Il trucco qui è "rinominare" le parentesi quadre che appartengono alla funzione Min e ripristinarle in seguito. Dovresti fare qualcosa del tipo:

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

Per il caso generale un parser sarebbe la strada da percorrere. Per casi speciali come questo usare un trucco potrebbe funzionare :-).

+0

c'è qualche possibilità di mostrare che questo "rinominare" regolarmente viene fatto in java? solo un frammento ... – Daniel

Problemi correlati