Java-Regex为运算符拆分数学表达式,不包括括号中的运算符

Java-Regex为运算符拆分数学表达式,不包括括号中的运算符,java,regex,Java,Regex,我需要使用下面的正则表达式拆分下面的字符串。但它会分割括号内的数据 Input T(i-1).XX_1 + XY_8 + T(i-1).YY_2 * ZY_14 Expected Output T(i-1).XX_1 , XY_8 , T(i-1).YY_2 , ZY_14 它不应该分割属于和的数据 我尝试了下面的代码,但是分割了和下面的数据 String[] result = expr.split("[+*/]"); 任何指向修复此问题的指针 我不熟悉这个正则表达式 Input (T(i

我需要使用下面的正则表达式拆分下面的字符串。但它会分割括号内的数据

Input
T(i-1).XX_1 + XY_8 + T(i-1).YY_2 * ZY_14

Expected Output
T(i-1).XX_1 , XY_8 , T(i-1).YY_2 , ZY_14
它不应该分割属于和的数据

我尝试了下面的代码,但是分割了和下面的数据

String[] result = expr.split("[+*/]");
任何指向修复此问题的指针

我不熟悉这个正则表达式

Input
(T(i-1).XX_1 + XY_8) + T(i-1).YY_2 * (ZY_14 + ZY_14)
Output
T(i-1).XX_1 , XY_8 , T(i-1).YY_2 , ZY_14 , ZY_14
如果是Ti-1,则需要忽略

对于下面的表达式,它不起作用

XY_98 + XY_99 +XY_100
String lineExprVal = lineExpr.replaceAll("\\s+","");
String[] result = lineExprVal.split("[+*/-] (?!(^))");

您可以像这样拆分括号外的所有内容:

String str = "T(i-1).XX_1 + XY_8 + T(i-1).YY_2 * ZY_14";
String result[] = str.split("[+*/-] (?!(^))");
//---------------------------^----^^--List of your delimiters

System.out.println(Arrays.toString(result));
这将打印:

[T(i-1).XX_1 , XY_8 , T(i-1).YY_2 , ZY_14]
这个想法很简单,您必须使用不在括号内的分隔符进行拆分

你可以在这里检查,也可以在这里检查正则表达式

编辑

在第二种情况下,必须使用此正则表达式:

String str = "(T(i - 1).XX_1 + XY_8)+  (i - 1).YY_2*(ZY_14 + ZY_14)";
String result[] = str.split("[+*+\\/-](?![^()]*(?:\\([^()]*\\))?\\))");

System.out.println(Arrays.toString(result));
(\w+\([\w-*+\/]+\).\w+)|((?:(\w+\(.*?\))))|(\w+)
这将为您提供:

[(T(i-1).XX_1+XY_8), T(i-1).YY_2, (ZY_14+ZY_14)]
 ^----Group1------^  ^--Groupe2-^  ^--Groupe3-^
你可以在这里找到,我从这篇文章中启发了这个解决方案

希望这能帮助你

在第二个数学表达式中拆分非常困难,如果不可能的话,因此您必须使用pattern,它更有用,因此对于您的表达式,您需要以下正则表达式:

String str = "(T(i - 1).XX_1 + XY_8)+  (i - 1).YY_2*(ZY_14 + ZY_14)";
String result[] = str.split("[+*+\\/-](?![^()]*(?:\\([^()]*\\))?\\))");

System.out.println(Arrays.toString(result));
(\w+\([\w-*+\/]+\).\w+)|((?:(\w+\(.*?\))))|(\w+)
这是一个你会更了解的例子

要获得结果,需要循环抛出结果:

public static void main(String[] args) {

    String input = "(T(i-1).XX_1 + XY_8) + X + T(i-1).YY_2 * (ZY_14 + ZY_14) + T(i-1)";

    Pattern pattern = Pattern.compile("(\\w+\\([\\w-*+\\/]+\\).\\w+)|((?:(\\w+\\(.*?\\))))|(\\w+)");
    Matcher matcher = pattern.matcher(input);

    List<String> reslt = new ArrayList<>();
    while (matcher.find()) {//loop throw your matcher 
        if (matcher.group(1) != null) {
            reslt.add(matcher.group(1));
        }
//In your case you have to avoid this two groups 
//            if (matcher.group(2) != null) {
//                reslt.add(matcher.group(2));
//            }
//            if (matcher.group(3) != null) {
//                reslt.add(matcher.group(3));
//            }
        if (matcher.group(4) != null) {
            reslt.add(matcher.group(4));
        }
    }
    reslt.forEach(System.out::println);
}

总是只有一级括号吗?@markusthoemes。对只有一级括号可以让括号外的输入包含-符号?事实上,即使是你的简单正则表达式也行。@Raje我已经发布了一个新的答案,就像我保证的那样,希望这能帮助你解释正则表达式。我不能理解它的第二部分,但即使是这个[+*/]正则表达式也会打印相同的输出。重点是什么,我不明白。如果括号外有-符号,这个正则表达式将不起作用。YCF_L对于减法,它会给出一些不同的结果Ti-1.XX_1-XY_8+Ti-1.YY_2*ZY_14让我们来看看。