在每个操作符/括号上拆分数学表达式

时间:2017-10-26 16:19:53

标签: java regex string

我正在尝试使用正则表达式来分割数学表达式,尽管无论我尝试什么,总有一个条件我缺失。
我需要在所有运算符(,),[,]和所有类型的括号++,--上拆分字符串。如果有增量或减量(?<![+-[0-9]])(?=[*/+-\[\]\(\)])|(?<=[*/+-\[\]\(\)])(?![+-[0-9]]),我需要将其保持为一个字符串。我还必须将多位数保持为一个字符串。

现在,我最接近的是:
[(([++[[(--2)]*33]])/22)+1]

例如,[,(,(,[,++,[,[,(,--,2,),],*,33,],],),/,22,),+,1,]应该给予 [,(,(,[,++,[,[,(,而是给出了 ,),],*,33,],],),/,22,), - 2 ,] 1 '(3 3 3 1 1 2)

1 个答案:

答案 0 :(得分:2)

tldr:继承您代码的其他开发人员将能够理解\d+正则表达式...但他们不太可能能够看到你的正则表达式怪物 - 或者任何其他长的正则表达式,就此而言 - 并了解正在发生的事情。

如果没有正则表达式,这是一种更简单的方法,对于可读性和性能而言,这通常是更好的选择。但是如果你必须使用正则表达式...

我的建议是使用更简单的\d+查找所有数字,或\D查找所有非数字;然后,您应该遍历结果并合并数组tokens的所有子集,其中tokens[i]tokens[i+1]都是+-

正如评论者所指出的那样,这仍然可能不如完全忽略RegExes并使用循环分裂。

虽然正则表达式很有趣并且对某些任务非常有用,但像这样的匹配括号任务特别不适合正则表达式(因为我们通常使用的数学语法是not a regular language)。