【问题标题】:Javascript : find regexp with capture to replace a^b by Math.pow(a, b)Javascript:使用捕获查找正则表达式以将 a^b 替换为 Math.pow(a, b)
【发布时间】:2015-11-03 15:29:38
【问题描述】:

我的字符串如下:

str = "(2+2)^(4*(5+6^(5^6))))";

如您所见,幂可以嵌套在另一个幂中,带括号也可以不带括号。

所以我想通过使用正则表达式来转换这个字符串,用 JavaScript 的 Math.pow(a,b) 替换 ^。

一个想法?提前非常感谢您,诚挚的。

【问题讨论】:

  • 把它放在文本编辑器上并使用查找/替换怎么样?
  • 然后你就可以使用ev[ai]l
  • Tushar : ev[ai]l : 也就是说?
  • 您是否真的需要使用正则表达式,或者这只是您试图解决问题的方式?

标签: javascript regex replace pow


【解决方案1】:

我认为使用正则表达式来解析表达式对你来说并不好......

为什么不使用像 http://mathjs.org/ 这样的数学表达式解析器库

【讨论】:

  • 是的,这是个好主意。但是为什么使用正则表达式解析表达式对我来说效果不佳?
  • 这不是一个简单的查找和替换。为了可靠地解析,您将需要执行多次传递并拥有能够感知关联和优先级的上下文的代码。其他人已经为您完成了艰苦的工作。使用图书馆:P
  • 是的,你是对的,在公式中处理优先级和关联非常困难。我的目标是用 javascript 创建一个计算器。我希望 mathjs 适合。非常感谢。
  • 其实问题是这是一个递归结构,非正则。 JS正则表达式不支持PCRE递归参数(?R)
  • 你绝对可以做到,但如果你要自己编写逻辑代码,一种常见的方法是通过对输入进行标记来构建解析树,然后对其进行评估。
【解决方案2】:

这些是您的算法必须执行的步骤:

  1. 找到“根^”字符
  2. 捕获^ 之前和之后的组
  3. 重复

这里的问题是,这种数据结构既是递归的,又是非正则的……

  • 它是递归的,因为您可以拥有无​​限数量的嵌套括号,并且每个都需要单独计算
  • 这是不规则的,例如,您可以有没有括号的组:(2+2)^2

...这使得找到所说的“root ^”有问题

此外,输入可能并不总是有效(例如,用户忘记关闭括号)。

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2012-09-20
    相关资源
    最近更新 更多