#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 \(\)