我正在尝试使用正则表达式来分割数学表达式,尽管无论我尝试什么,总有一个条件我缺失。
我需要在所有运算符(,),[,]
和所有类型的括号++,--
上拆分字符串。如果有增量或减量(?<![+-[0-9]])(?=[*/+-\[\]\(\)])|(?<=[*/+-\[\]\(\)])(?![+-[0-9]])
,我需要将其保持为一个字符串。我还必须将多位数保持为一个字符串。
现在,我最接近的是:
[(([++[[(--2)]*33]])/22)+1]
例如,[,(,(,[,++,[,[,(,--,2,),],*,33,],],),/,22,),+,1,]
应该给予
[,(,(,[,++,[,[,(,
而是给出了
,),],*,33,],],),/,22,),
的 - 2 ,]
的 1 '(3 3 3 1 1 2)
答案 0 :(得分:2)
tldr:继承您代码的其他开发人员将能够理解\d+
正则表达式...但他们不太可能能够看到你的正则表达式怪物 - 或者任何其他长的正则表达式,就此而言 - 并了解正在发生的事情。
如果没有正则表达式,这是一种更简单的方法,对于可读性和性能而言,这通常是更好的选择。但是如果你必须使用正则表达式...
我的建议是使用更简单的\d+
查找所有数字,或\D
查找所有非数字;然后,您应该遍历结果并合并数组tokens
的所有子集,其中tokens[i]
和tokens[i+1]
都是+
或-
。
正如评论者所指出的那样,这仍然可能不如完全忽略RegExes并使用循环分裂。
虽然正则表达式很有趣并且对某些任务非常有用,但像这样的匹配括号任务特别不适合正则表达式(因为我们通常使用的数学语法是not a regular language)。