繁体   English   中英

在每个运算符/括号上拆分数学表达式

[英]Split mathematical expression on every operator/bracket

我正在尝试使用正则表达式拆分数学表达式,尽管无论我尝试什么,我总是缺少一个条件。
我需要在所有运算符+,-,*,/和所有类型的括号(,),[,]上拆分字符串。 如果有递增或递减++,--我需要将其保留为一个字符串。 我还必须将多位数字保留为一个字符串。

现在,我最接近的是:
(?<![+-[0-9]])(?=[*/+-\\[\\]\\(\\)])|(?<=[*/+-\\[\\]\\(\\)])(?![+-[0-9]])

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

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

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

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

正如评论者所指出的,与完全忽略 RegEx 并使用循环进行拆分相比,这可能仍然不如其性能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM