Java regex: как заменить все символы в скобках?
Как я могу заменить:
((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)))
с регулярным выражением?
Спасибо дж
4 ответа
Это не очень хорошая работа для регулярных выражений. Похоже, вы захотите написать быстрый парсер рекурсивного спуска. Если я вас правильно понял, вы хотите заменить инфиксный оператор% на имя функции XYZ?
Так (выражение% выражение) становится XYZ(выражение, выражение)
Это выглядит как хороший ресурс для изучения: http://www.cs.uky.edu/~lewis/essays/compilers/rec-des.html
Удовлетворит ли это ваши требования, чтобы сделать следующее:
- найти
(
в первой позиции или предшествует пробел и заменить егоXYZ(
- найти
%
и заменить его на,
Если эти две инструкции являются достаточными и удовлетворительными, то вы можете преобразовать исходную строку в три "хода":
- замещать
^\(
сXYZ(
- замещать
\(
сXYZ(
- замещать
%
с,
Смотрите этот код:
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 ))), потому что в противном случае вы не следовали своим собственным соглашениям. Надеюсь, этот код поможет вам. Для меня это было хорошее упражнение, по крайней мере.
Я не знаю много о регулярных выражениях, но попробуйте взглянуть на это, особенно 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
Вы могли бы по крайней мере проверить их, пока не придет подробный ответ.