有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java正则表达式拆分运算符的数学表达式,不包括括号中的运算符

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

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

如果是T(i-1),则需要忽略

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

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

共 (2) 个答案

  1. # 1 楼答案

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

    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]
    

    这个想法很简单,您必须使用不在括号内的分隔符进行拆分

    你可以在这里检查这个ideone,你可以在这里检查你的正则表达式Regex demo


    编辑

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

    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));
    

    这将为您提供:

    [(T(i-1).XX_1+XY_8), T(i-1).YY_2, (ZY_14+ZY_14)]
     ^  Group1   ^  ^ Groupe2-^  ^ Groupe3-^
    

    你可以找到Regex Demo,我从这里的帖子Regex to match only comma's but not inside multiple parentheses中启发了这个解决方案

    希望这能帮助你

  2. # 2 楼答案

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

    (\w+\([\w-*+\/]+\).\w+)|((?:(\w+\(.*?\))))|(\w+)
    

    这里有一个Demo regex你会理解得更多

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

    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);
    }
    

    这将为您提供:

    T(i-1).XX_1
    XY_8
    X
    T(i-1).YY_2
    ZY_14
    ZY_14