Java регулярное выражение: как заменить все символы в скобках? - PullRequest
0 голосов
/ 18 марта 2012

Как мне заменить:

((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 ]

1 голос
/ 18 марта 2012

это не очень хорошая работа для регулярных выражений. Похоже, вы захотите написать быстрый парсер рекурсивного спуска. Если я вас правильно понял, вы хотите заменить инфиксный оператор% на имя функции XYZ?

Итак (выражение% выражение) становится XYZ (выражение, выражение)

Это похоже на хороший ресурс для изучения: http://www.cs.uky.edu/~lewis/essays/compilers/rec-des.html

0 голосов
/ 20 августа 2016

Удовлетворяет ли оно вашим требованиям, чтобы сделать следующее:

  1. Найдите ( в первой позиции или перед пробелом и замените его на XYZ(
  2. Найдите % и замените его на ,

Если эти две инструкции являются достаточными и удовлетворительными, то вы можете преобразовать исходную строку в три "хода":

  1. Заменить ^\( на XYZ(
  2. Заменить \( на XYZ(
  3. Заменить % на ,
0 голосов
/ 19 марта 2012

См. Этот код:

    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 ) )), потому что в противном случаеВы не следовали своим собственным соглашениям.Надеюсь, этот код поможет вам.По крайней мере, для меня это было хорошее упражнение.

0 голосов
/ 18 марта 2012

Я не знаю много о регулярных выражениях, но попробуйте взглянуть на это, особенно на 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

Вы могли бы по крайней мере проверитьих, пока подробный ответ не придет.

...