2011-12-19 7 views
6

次のような表現ができます(Sqrt [XXX]いくつかの "Sqrt [some text inside]"をいくつかのSqrt(内部のテキスト)に変換するにはどうすればいいですか?

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

)unknowであると私はSqrt(XXX)にすべてのSqrt[XXX]をオンにしたい、私はSqrt()にカッコ

[]ブラケットを交換したいので、上記の例では、

のようになります。私は正規表現でそれを行うことができますどのように私は(Min隣のもののような)式で他の[]ブラケットを「傷つける」にしたくないSqrt(A+B) + Sqrt(Min[A,B]) * Min[Sqrt(C),D]

+4

あなたは正規表現でそれを行うことはできませんが、ここでは受け入れ答えを参照してください http://stackoverflow.com/questions/5475804/regular-expression-for-math-operations-with-parentheses –

+0

@MK私はと恐れます彼は一般的に逆戻りすることができました(賢明なREとperlのおかげで私たちが今や持っている混乱の〜)。しかし、私はそれが行く方法ではないことに同意します。 – Voo

+0

@Voo私はあなたがバックトラックしていてもいられないと確信しています。 –

答えて

3

これは、文字列内の文字に対して繰り返しを使用して行うことができます。最初にSqrt[のインデックスを探し、その後、一致する閉じ括弧を探します。私はそれを適切にテストし、そうしてくださいしていない

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

:ここ

は、いくつかのサンプルコードです。

+0

(+1)私はコードをテストしようとはしませんでしたが、このタイプのアプローチは正規表現を使うよりも問題に適していると思います。 – NPE

+0

これでうまくいくはずですが、本当に 'Sqrt [A + Sqrt [A]] 'を使ってテストケースを追加すべきです。しかし、問題なく動作します。 – Voo

+0

Sqrt [A + Sqrt [A]]、:)で動作します – Daniel

1

ソース文字列の指定された形式を使用すると、3つの正規表現で行うことができます。ここでのトリックは、Min関数に属する角括弧を "名前を変更して"後で復元することです。

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

一般的なケースでは、パーサが行く方法です。このような特殊なケースでは、トリックを使用すると:-)動作する可能性があります。

+0

この定期的な "名前の変更"がJavaで行われることを表示する機会はありますか?ちょっとしたスニペット... – Daniel

関連する問題