0

我正在使用 math.js 库,我需要取一些变量的指数。我有以下字符串:

//Ok
pow(y,2)
pow(y,2+2)
pow(y,2-3)
pow(y,2.2)
pow(y,(23)/(2))+23123
pow(y,pow(2,pow(2,4)))-932
pow(y,pow(2,1*pow(2,0.5)))+23

//Erro
pow(y,2)*pow(2,2)
pow(y,3)-pow(2,2)
pow(y,4)+pow(2,2)
pow(y,pow(2,1*pow(2,0.5)))+pow(1,1)

我在使用正则表达式实现此搜索时遇到问题。pow(a,b) 函数由两个参数组成,“a”是基数,“b”是指数。

在上面代码的最后四个字符串中,我只需要捕获“2”、“3”、“4”和“pow(2,1*pow(2,0.5))”。我不想参加“*”、“+”和“-”之后的部分。

由于可以链接 pow() 函数,并且“a”和“b”都可以具有算术运算符和函数,如 pow() 和 sqrt(),结果证明这非常复杂。有没有办法使用正则表达式解决这个问题?

我得到的最接近的是这个正则表达式:https ://regex101.com/r/hB1cg4/4

4

2 回答 2

1

如评论中所述,在正则表达式中进行平衡匹配很困难,尽管 .NET 正则表达式支持此功能。请看这个答案:https ://stackoverflow.com/a/35271017/8031896

尽管如此,还是有一种使用常见正则表达式风格的变通方法。但是,请注意,您可能需要根据数学符号中括号递归层的数量对其进行修改。

((?<=^pow)\(([^()]*|\(([^()]*|\([^()]*\))*\))*\))

演示:https ://regex101.com/r/hB1cg4/6

更详细的解释请看这个答案:https ://stackoverflow.com/a/18703444/8031896

于 2020-03-20T06:12:22.720 回答
1

以下正则表达式匹配所有“Euro”字符串和一个变体,但不幸的是无法匹配两个“OK”字符串。也许一些调整是可能的。正则表达式包含一个捕获组,用于捕获感兴趣的信息。

^pow\([^,]+,(\d[^()]*|pow\(\d+,\d+(?:\)|[^()]*\([^()]*\)\)))\).*

Javascript 演示

为了匹配“Euro”字符串,我假设pow(2,1*pow(2,0.5))inpow(y,pow(2,1*pow(2,0.5)))+23表示嵌套“pow”的最大数量。

正则表达式执行以下操作。

^               # match beginning of line
pow\(           # match 'pow('
[^,]+           # match 1+ chars other than ','
,               # match ','
(               # begin capture group 1
  \d[^()]*      # match a digit, 0+ chars other than '(' and ')' 
  |             # or
  pow\(\d+,\d+  # match 'pow(', 1+ digits, ',' 1+ digits
  (?:           # begin non-cap grp
    \)          # match ')'
    |           # or
    [^()]*      # match 0+ chars other than '(' and ')' 
    \(          # match '('
    [^()]*      # match 0+ chars other than '(' and ')' 
    \)\)        # match '))'
  )             # end non-cap grp
)               # end cap grp 1
\)              # match ')'
于 2020-03-20T07:09:18.803 回答