Регулярное выражение для разделения строки при игнорировании содержимого скобок

#java #regex

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

Вопрос:

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

 "(z/(2 t))/((2.0 var)*(x/y))"
 

Должно стать:

 ["(z/(2 t))", "/", "((2.0 var)*(x/y))"]
 

Я попытался использовать следующее регулярное выражение:

 ((?<=[ */\-])|(?=[ */\-]))(?![^(]*[)])
 

Но разделение происходит между внутренними выражениями:

 ["(z", "/", "(2 t))", "/", "((2.0 var)", "*", "(x/y))"]
 

Ответ №1:

Я уверен, что есть гораздо более чистый ответ, чем этот, но это должно выполнить эту работу:

   import java.util.*;

  public class JavaFiddle
  {
    public static void main(String[] args)
    {
      // starting here with the result of your regex operation
      String[] yourOutputArray = {"(z", "/", "(2 t))", "/", "((2.0 var)", "*", "(x/y))"};

      List<String> listy = new ArrayList<String>();
      String s = "";
      for(int i = 0; i < yourOutputArray.length; i  ){
          s  = yourOutputArray[i];

          if(characterCount(s,"(") > 0 amp;amp; characterCount(s,"(") == characterCount(s,")")){
              listy.add(s);
              s = "";
          }else if(s.length() > 0 amp;amp; characterCount(s,"(") == 0){
              // this must be an operator we want to split on
              listy.add(s);
              s = "";
          }
      }

      // listy is the result you are looking for
      System.out.println(listy); // [(z/(2 t)), /, ((2.0 var)*(x/y))]
    }

    public static int characterCount(String input, String character){
        return input.length() - input.replace(character, "").length();
    }
  }
 

Ответ №2:

Это регулярное выражение может помочь вам разделить их:

 . )(/)(. 
 

Оно создает единственную группу в середине, которая включает первую /.

введите описание изображения здесь

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

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

2. 2*((a-b) (b*(a 10))); (2 a) — (2*a) (b *(c * c)) возвращает ["2", "*", "((a-b) (b*(a 10)))"] ; ["(2 a)", "-", "(2*a)", " ", "(b*(c*c))"] соответственно, но на самом деле может быть любое количество таких сложных выражений, содержащих более простые