#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))"]
соответственно, но на самом деле может быть любое количество таких сложных выражений, содержащих более простые