0

どうすれば交換できますか:

((90+1)%(100-4)) + ((90+1)%(100-4/(6-4))) - (var1%(var2%var3(var4-var5)))

XYZ((90+1),(100-4)) + XYZ((90+1),100-4/(6-4)) - XYZ(var1,XYZ(var2,var3(var4-var5)))

正規表現で?

ありがとう、J

4

4 に答える 4

1

これは、正規表現にとって非常に良い仕事のようには見えません。代わりに、迅速な再帰降下パーサーを書きたいと思うかもしれません。私の理解が正しければ、中置演算子 % を関数名 XYZ に置き換えたいですか?

したがって、(式 % 式) は XYZ(式, 式) になります。

これは勉強するのに良いリソースのようです: http://www.cs.uky.edu/~lewis/essays/compilers/rec-des.html

于 2012-03-18T11:28:19.317 に答える
0

このコードを参照してください:

    String input = "((90+1)%(100-4)) + ((90+1)%(100-4/(6-4))) - (var1%(var2%var3(var4-var5)))";
    input = input.replaceAll("%", ",");
    int level = 0;
    List<Integer> targetStack = new ArrayList<Integer>();
    List<Integer> splitIndices = new ArrayList<Integer>();
    // add the index of last character as default checkpoint
    splitIndices.add(input.length());
    for (int i = input.length() - 1; i >= 0; i--) {
        if (input.charAt(i) == ',') {
            targetStack.add(level - 1);
        } else if (input.charAt(i) == ')') {
            level++;
        }
        else if (input.charAt(i) == '(') {
            level--;
            if (!targetStack.isEmpty() && level == targetStack.get(targetStack.size() - 1)) {
                splitIndices.add(i);
            }
        }
    }
    Collections.reverse(splitIndices); // reversing the indices so that they are in increasing order
    StringBuilder result = new StringBuilder();
    for (int i = 1; i < splitIndices.size(); i++) {
        result.append("XYZ");
        result.append(input.substring(splitIndices.get(i - 1), splitIndices.get(i)));
    }
    System.out.println(result);

出力は期待どおりです。

XYZ((90+1),(100-4)) + XYZ((90+1),(100-4/(6-4))) - XYZ(var1,XYZ(var2,var3(var4-var5)))

ただし、少しハックであり、期待どおりに動作しない可能性があることに注意してください。ところで、いくつかの括弧を追加した出力を少し変更する必要がありました: XYZ((90+1), ( 100-4/(6-4 ) )) うまくいけば、このコードが役に立ちます。私にとっては、少なくとも良い運動になりました。

于 2012-03-19T15:31:31.603 に答える
0

私は正規表現についてあまり知りませんが、これ、特に 9 と 10 を見てみてください: http://www.mkyong.com/regular-expressions/10-java-regular-expression-examples-you-should-know/

そしてもちろん: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html

詳細な回答が得られるまで、少なくともそれらをチェックアウトできます.

于 2012-03-18T11:21:12.730 に答える
0

次のことを行うことは、あなたの要件を満たしますか?

  1. 最初の位置またはスペースの前を検索(し、それを次のように置き換えますXYZ(
  2. それを見つけ%て置き換えます,

これらの 2 つの指示が十分で満足のいくものである場合、元の文字列を 3 つの「移動」で変換できます。

  1. ^\(と置き換えますXYZ(
  2. \(と置き換えますXYZ(
  3. %と置き換えます,
于 2016-08-19T21:52:24.883 に答える