如何使用正则表达式拆分此表达式?

时间:2016-08-22 03:49:23

标签: java arrays regex split

我正在努力解决方程,但我想用常数来编写我的解决方案。

我正在研究的方法叫做decompose,它将方程式分解为常数。问题在于,当我分裂时,具有负常数的方程将产生具有常数绝对值的数组。如何在使用正则表达式的同时实现减号?

如果输入为ax+by=c,则输出应为{a,b,c}

有用的奖励:有没有办法删除分割时创建的空元素。例如,如果我键入等式2x+3y=6,我最终得到一个" raw"包含元素{2,,3,,6}

的数组

代码:

public static int[] decompose(String s)
{
    s = s.replaceAll(" ", "");

    String[] termRaw = s.split("\\D"); //Splits the equation into constants *and* empty spaces.
    ArrayList<Integer> constants = new ArrayList<Integer>(); //Values are placed into here if they are integers.
    for(int k = 0 ; k < termRaw.length ; k++)
    {
        if(!(termRaw[k].equals("")))
        {
            constants.add(Integer.parseInt(termRaw[k]));
        }

    }
    int[] ans = new int[constants.size()];

    for(int k = 0 ; k < constants.size(); k++) //ArrayList to int[]
    {
        ans[k] = constants.get(k);
    }
    return ans;
}

2 个答案:

答案 0 :(得分:2)

这个答案的一般策略是用运算符分割输入方程,然后在循环中提取系数。但是,有几个边缘情况需要考虑:

  • 加号(+)以每个减号为前缀,不会作为第一个词出现
  • 分裂后
  • ,通过查看空字符串
  • 来检测正系数 分裂后
  • 通过看负号来检测负系数


String input = "-22x-77y+z=-88-10+33z-q";
input = input.replaceAll(" ", "")             // remove whitespace
             .replaceAll("=-", "-");          // remove equals sign
             .replaceAll("(?<!^)-", "+-");    // replace - with +-, except at start of line
// input = -22x+-77y+z+-88+-10+33z+-

String[] termRaw = bozo.split("[\\+*/=]");
// termRaw contains [-22x, -77y, z, -88, -10, 33z, -]

ArrayList<Integer> constants = new ArrayList<Integer>();
// after splitting,
// termRaw contains [-22, -77, '', -88, -10, 33, '-']
for (int k=0 ; k < termRaw.length ; k++) {
    termRaw[k] = termRaw[k].replaceAll("[a-zA-Z]", "");
    if (termRaw[k].equals("")) {
        constants.add(1);
    }
    else if (termRaw[k].equals("-")) {
        constants.add(-1);
    }
    else {
        constants.add(Integer.parseInt(termRaw[k]));
    }
}

答案 1 :(得分:1)

如果你正在使用java8,那么你可以使用这一行方法:

public static int[] decompose(String s) {
    return Arrays.stream(s.replaceAll("[^0-9]", " ").split("\\s+")).mapToInt(Integer::parseInt).toArray();
}

<强>样本:

1。输出

[2, 3, 6]

2。代码

import java.util.*;

public class HelloWorld {
    public static void main(String args[]) {
        String s = "2x+3y=6";
        int[] array = decompose(s);
        System.out.println(Arrays.toString(array));
    }

    public static int[] decompose(String s) {
        return Arrays.stream(s.replaceAll("[^0-9]", " ").split("\\s+")).mapToInt(Integer::parseInt).toArray();
    }
}