[英]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.