用正则表达式分割一个简单的数学表达式

时间:2010-07-30 17:21:22

标签: java regex math

我试图将正则表达式拆分为1.5 + 4.2 *(5 + 2)等运算符与运算符 - + * /所以输出将输入到数组中以便我可以单独解析

[0]1.5
[1]+
[2]4.2
[3]*
[4](
[5]5
[6]+
[7]2
[8]) 

我发现\b可以在1+2+3上工作但是如果我有小数点则不会分裂。

我尝试使用\b(\.\d{1,2})进行拆分,但不会在小数点上拆分

4 个答案:

答案 0 :(得分:16)

您可以使用零宽度匹配前瞻和后置组合作为替代。

    String equation = "1.5+4.2*(5+2)";

    String regex = "(?<=op)|(?=op)".replace("op", "[-+*/()]");

    // actual regex becomes (?<=[-+*/()])|(?=[-+*/()])

    System.out.println(java.util.Arrays.toString(
        equation.split(regex)
    ));
    //  ___  _  ___  _  _  _  _  _  _
    // [1.5, +, 4.2, *, (, 5, +, 2, )]

解释

  • […]是一个字符类定义
  • (?<=…)是一个外观;它声称我们可以将与左侧匹配
  • (?=…)是一个先行者;它断言我们可以将与正确的
  • 相匹配
  • this|that正在改变
  • 因此,(?<=op)|(?=op)op之后或之前的任何地方都匹配
    • ...其中op[-+*/()]取代,即匹配运算符的字符类
      • 请注意-首先在此处,因此它不会成为范围定义元字符

参考

相关问题


用于拆分的零宽度匹配正则表达式的更多示例

以下是在零宽度匹配结构上拆分的更多示例;这可以用来分割字符串,但也保留分隔符。

简单的句子分割,保留标点符号:

    String str = "Really?Wow!This.Is.Awesome!";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[.!?])")
    )); // prints "[Really?, Wow!, This., Is., Awesome!]"

使用\G

将长字符串拆分为固定长度的部分
    String str = "012345678901234567890";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=\\G.{4})")
    )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"

在大写字母之前拆分(第一个除外!)

    System.out.println(java.util.Arrays.toString(
        "OhMyGod".split("(?=(?!^)[A-Z])")
    )); // prints "[Oh, My, God]"

以下相关问题提供了各种示例。

相关问题

答案 1 :(得分:4)

Pattern pattern = Pattern.compile("((\\d*\\.\\d+)|(\\d+)|([\\+\\-\\*/\\(\\)]))");
Matcher m = pattern.matcher("1.5+4.2*(5+2)/10-4");
while(m.find()) {
    System.out.printf("%s ", m.group());
}

output: 1.5 + 4.2 * ( 5 + 2 ) / 10 - 4

您还可以使用?:来避免捕获群组。我把它留给简单。

答案 2 :(得分:3)

使用匹配,而不是拆分:

(?:\d+\.)?\d*(?:e[+\-]?\d+)?|[\s\-\/()+*%=]

此正则表达式还将接受有效的浮点数:1.2e+3 * 2,它应该等于2400。其他受访者给出的正则数据将失败。

答案 3 :(得分:1)

使用[+-/*()]拆分字符串。