我正在用 Javascript 编写一个计算器。
我想将:[表达式1]^[表达式2]
翻译成:Math.pow([表达式1], [表达式2])
当我有像 5^-3
这样的简单表达式时,使用正则表达式很容易做到,但是当它带有更复杂的表达式时,例如:
(-5*(6+3)-5)^((2*2)-2)+(4*5)
由于嵌套括号,我不知道如何使用正则表达式处理它......
有什么建议吗?谢谢。
最佳答案
使用正则表达式模式:
/((?:(?=[^()]*\d)\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))\^((?:(?=[^()]*\d)\-?\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))/
检查this fiddle .
<小时/>说明:
[步骤 1]::正则表达式模式包含两个几乎相同的子模式,与 ^
链接。之间的符号
((?:(?=[^()]*\d)\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))
\^
((?:(?=[^()]*\d)\-?\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))
唯一的区别是第二个( ^
之后)允许负数作为简单参数( \-?
)
[步骤 2]::步骤 1 中的子模式有两种选择:
(?:(?=[^()]*\d)\-?\d*(?:\.\d*)?)
|
(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\))
[步骤 3]::第一个选择是数字 - 例如:1234
或12.34
或1234.
或.1234
(?=[^()]*\d)
\-?\d*
(?:\.\d*)?
[步骤 4]::第二种选择是嵌套括号公式
\(
(?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)
\)
[步骤 5]::可能简单也可能复杂(里面有其他括号)
(?:[^()]+)
|
(?:[^()]*\([^()]*\)[^()]*)+
[步骤 6]::如果是复杂的并且里面有一些其他括号,我们确保有嵌套
[^()]*
\(
[^()]*
\)
[^()]*
关于javascript - javascript中嵌套括号的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12250481/