Разделение строки с помощью арифметических операторов и функций в java

#java #regex #split

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

Вопрос:

Мне нужно некоторое руководство о том, как разделить строку с помощью арифметических операторов и функций в java, поскольку строка примера является:

 "string1" "String2" >= 10 * function1() / function2()
  

операторы могут быть:

   - * / ** / % / ( ) = != > < <= >=
  

После разделения
Мне нужен вывод, подобный:

 array[0]=string1
array[1]=string2
array[2]=10
  

Мне нужны только объекты внутри двойных кавычек и содержимого или чисел, а не функции (function1()) или операторы.

Мне нужно регулярное выражение для этой проблемы

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

1. Хотя, вероятно, это возможно сделать с помощью регулярного выражения — почему вы не смотрите на что-то вроде JLex для создания лексера?

Ответ №1:

Вы можете удалить все операторы из строки, а затем сопоставить все, кроме строк с () в конце.

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

1. При удалении операторов используйте специальный символ, а затем разделите строку с помощью специального символа.

Ответ №2:

Я рекомендую создать анализатор, например, используя JavaCC или, возможно, parboiled https://github.com/sirthias/parboiled/wiki / (это еще не пробовал)

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

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

Ответ №3:

Если вам нужно регулярное выражение для извлечения чего-либо внутри двойных кавычек и чисел, то вы можете использовать этот Java-код:

 public static void main(String[] args) {
    Pattern p = Pattern.compile(""(\w )"|\b\d \b");
    Matcher m = p.matcher(
        ""string1" "String2" >= 10 * function1() / function2()");
    List<String> parts = new ArrayList<String>();
    while (m.find()) {
        if (m.group(1) != null)
            parts.add(m.group(1));
        else
            parts.add(m.group(0));
    }
    System.out.println(Arrays.toString(parts.toArray(new String[] {})));        
}
  

которое выводит:

 [string1, String2, 10]
  

Примечание: Я не уверен, что регулярное выражение является лучшим инструментом в этом случае. Как предлагали другие, возможно, вы захотите изучить использование синтаксического анализатора.

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

1. Спасибо за ваш код, мне нужен вывод в виде string1, string2, 10 без двойных кавычек. Можете ли вы для этого?

2. @user782482: Я изменил свой код, чтобы удовлетворить ваш запрос. Я надеюсь, что это поможет.

3. да, это работает нормально. Еще одна справка, если я хочу, чтобы функции также были в этом массиве, означает, что мне следует делать? например [string1,string2,10,function1(),function2()]

4. Если вы хотите иметь functionX() на выходе, измените регулярное выражение следующим образом: "(\w )"|\b\d \b|function\d \(\)