Проверьте, находится ли char в блоке ()

#java #regex

#java #регулярное выражение

Вопрос:

Я хотел бы проверить, находится ли точка с запятой ( ; ) в скобках AND OR блока или внутри строки.

Например:

 IF(AND(ROUND($GX18-SUM(0)/$M$12;2)<=0;$AK$7=1);0;OR(1;A2) O2)
  

Если он не находится в AND or OR , я заменяю его на # :

 IF(AND(ROUND($GX18-SUM(0)/$M$12;2)<=0$AK$7=1)#0#OR(1;A2) O2)
  

Я знаю, как выполнить подстановку, но как мне определить, находится ли ; внутри такого блока?

Обновить

Использование регулярных выражений, возможно, кажется довольно сложным. Однако, чтобы устранить проблему:

Как определить, находится ли определенный char( ; ) в AND(...) or OR(...) ? Это мне очень помогло бы!

Комментарии:

1. Вы не можете использовать регулярное выражение для обработки произвольной вложенности, как это было бы необходимо здесь для круглых скобок в вашем логическом выражении.

2. Регулярное выражение недостаточно мощно для этого.

3. @ScottHunter Это в основном формула Excel, которую я хотел бы проанализировать. Итак, как я могу определить круглые скобки и «снаружи» ; . Я благодарен за ваши предложения!

4. @Kare как обсуждалось в вашем предыдущем вопросе, это на самом деле очень сложно, если вообще возможно, с регулярным выражением или, по крайней мере, только с регулярным выражением. Я предлагаю вам реализовать свой собственный синтаксический анализатор и повторно использовать различные вложенные уровни круглых скобок / вместе с отношениями родительского и дочернего узлов. Это может быть много работы в зависимости от разнообразия ваших случаев.

5. Регулярные выражения — это применение контекстно-свободных грамматик. Следовательно, вам нужны более мощные языки для выражения ваших потребностей, в частности, контекстно-зависимый язык. Я согласен с @Mena — вам нужно реализовать свой собственный синтаксический анализатор.

Ответ №1:

Надеюсь, следующий java-код поможет решить вашу проблему,

 String str = "IF(AND(ROUND($GX18-SUM(0)/$M$12;2)<=0$AK$7=1);0;OR(1;A2) O2)";
        char[] ch = str.toCharArray();
        int count = 0;
        String temp = "";
        for (int i = 0; i < ch.length; i  ) {
            temp = temp   ch[i];
            if ("AND(".equals(temp) || "OR(".equals(temp)) {
                count  ;
            }
            if ("(".equals(temp) amp;amp; count > 0) {
                count  ;
            }
            if (")".equals(temp) amp;amp; count > 0) {
                count--;
            }
            if (";".equals(temp) amp;amp; count == 0) {
                ch[i] = '#';
            }
            if ((!"AND(".startsWith(temp) amp;amp; !"OR(".startsWith(temp)) || temp.length() > 4) {
                temp = "";
            }
        }
        System.out.println("Expected Data >> "   String.valueOf(ch));
  

Комментарии:

1. Почему вы делаете temp.length> 4?

2. значение temp продолжайте добавлять к следующему символу, если он начинается с «И (» или «ИЛИ(«. Поэтому, чтобы избежать этого, мы проверяем, что «length_value> 4» и делаем временную переменную равной «». Пример: теперь временное значение равно «И (R», тогда нам нужно сбросить значение как «».