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

我试图将正则表达式拆分为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})拆分,但它不会在小数点上拆分

 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 

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

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

  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)之后或之前的任何地方
    • ...其中op[-+*/()]替换,即匹配运算符的字符类
      • 请注意-首先是这里,因此它不会成为范围定义元字符

参考

  • regular-expressions.info/Lararounds和Alternation with Vertical Bar and Character Class

相关问题

  • 正则表达式(?<=#)[^#]+(?=#)工作?
  • 正则表达式:为什么[01-12]范围不按预期工作?

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

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

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

  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("(?=(?!^)[AZ])") )); // prints "[Oh, My, God]" 

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

相关问题

  • 你能在String split中使用零宽度匹配正则表达式吗?
    • "abcghi" -> "abc", "", "ghi", "", ""
  • 如何在Java中将CamelCase转换为人类可读的名称?
    • "AnXMLAndXSLT2.0Tool" -> "An XML And XSLT 2.0 Tool"
    • C#版本: 是否有一种优雅的方法来解析单词并在大写字母之前添加空格
  • Java分裂正在吃我的角色
  • 有没有办法用String.split()分割字符串并包含分隔符?
  • 正则表达式拆分字符串但保留分隔符

使用匹配,而不是拆分:

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

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

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