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

sut*_*toL 2 java regex math

我试图在1.5 + 4.2*(5 + 2)等方程式上运用正则表达式与运算符 - +*/所以输出将输入到数组中,这样我就可以单独解析

[0]1.5
[1]+
[2]4.2
[3]*
[4](
[5]5
[6]+
[7]2
[8]) 
Run Code Online (Sandbox Code Playgroud)

我已经发现,在\b将工作于1+2+3但是如果我有它不会分裂小数点.

我试过分裂,\b(\.\d{1,2})但它没有分裂小数点

pol*_*nts 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, )]
Run Code Online (Sandbox Code Playgroud)

说明

  • […] 是一个字符类定义
  • (?<=…)是一个外观; 它断言我们可以匹配左边
  • (?=…)是一个先行; 它声称我们可以匹配到右边
  • this|that 是交替
  • 因此,(?<=op)|(?=op)比赛之后或之前的比赛op
    • ... op替换为where [-+*/()],即匹配运算符的字符类
      • 请注意,这-是第一个,因此它不会成为范围定义元字符

参考

相关问题


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

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

简单的句子分裂,保持标点符号:

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

使用将长字符串拆分成固定长度的部分 \G

    String str = "012345678901234567890";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=\\G.{4})")
    )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"
Run Code Online (Sandbox Code Playgroud)

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

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

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

相关问题


Mar*_*amy 6

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
Run Code Online (Sandbox Code Playgroud)

您还可以使用 ?: 来避免捕获组。我把它留下来让它变得简单。


归档时间:

查看次数:

14196 次

最近记录:

12 年,10 月 前