2011-12-19 13 views
6

Mam następujący wyrażenie, które może wyglądać tak (ilość Sqrt [XXX] jest unknow)Jak zmienić kilka "Sqrt [trochę tekstu wewnątrz]" na kilka Sqrt (jakiś tekst wewnątrz), mam na myśli od [] do()

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

i chcę, aby włączyć wszystkie Sqrt[XXX] w Sqrt(XXX), chcę wymienić [] wsporniki Sqrt do () nawiasach

więc powyższy przykład będzie wyglądał

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

ja nie chcę „zranić” drugie [] nawiasy w wyrażeniu (jak te obok Min)

Jak mogę zrobić to z regex?

+4

Nie można zrobić z wyrażeń regularnych, Akceptowane odpowiedzi tutaj http://stackoverflow.com/questions/5475804/regular-expression-for-math-operations-with-parentheses –

+0

@MK boję się backtracking na ogół mógł (różnica między rozsądnymi RE i bałaganem, który mamy teraz dzięki perl ~). Ale zgadzam się, że to nie jest droga. – Voo

+0

@Voo Jestem prawie pewien, że nie można nawet cofnąć się. –

Odpowiedz

3

Możesz to zrobić, używając iteracji na znakach w łańcuchu. Najpierw sprawdź indeks Sqrt[, a następnie poszukaj pasującego nawiasu zamykającego.

Oto przykładowy kod:

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

nie testowałem go poprawnie, więc należy zrobić.

+0

(+1) Nie próbowałem testować kodu, ale myślę, że ten typ podejścia jest bardziej odpowiedni dla problemu niż użycie wyrażenia regularnego. – NPE

+0

Tak, to powinno zadziałać, chociaż naprawdę należy dodać także testc z 'Sqrt [A + Sqrt [A]]'. Ale to powinno działać równie dobrze bez problemów. – Voo

+0

działa na Sqrt [A + Sqrt [A]], :) – Daniel

1

Korzystając z podanego formatu ciągu źródłowego, można to zrobić za pomocą 3 wyrażeń regularnych. Sztuką jest tutaj "zmienić nazwę" nawiasów kwadratowych należących do funkcji Min i przywrócić je później. Zrobiłbyś coś takiego:

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

Dla ogólnego przypadku parser byłby drogą do zrobienia. W przypadku specjalnych przypadków takich jak ten przy użyciu podstępu może zadziałać :-).

+0

jest szansa, że ​​ta regularna "zmiana nazwy" zostanie wykonana w języku Java? tylko fragment ... – Daniel

Powiązane problemy