gpt4 book ai didi

javascript - 正则表达式数学表达式单步拆分

转载 作者:行者123 更新时间:2023-12-03 23:47:38 25 4
gpt4 key购买 nike

首先,关于数学表达式的正则表达式有很多很多问题,如果我忽略了一个已经回答了这个问题的问题,抱歉。虽然这源于解析数学表达式(没有 eval ...),但更多的是“这不能用一个棘手的正则表达式或类似的东西来完成吗?”。

有没有办法拆分包含像 "-5.42+2--3*-5.5/-2+-4" 这样的数学表达式的字符串?至 ["-5.42", "+", "2", "-", "-3", "*", "-5.5", "/", "-2", "+", "-4"] .split [1]?否则说,拆分二元运算符( /[+*/]|(?<!^|[+\-*/])-/ ,后面是问题所在)及其参数( /-?\d+(\.\d+)?/ )。一元减号每个数字最多出现一次,也就是没有 --- .这一步没有大括号。

我的看法是,如果不向后看,就无法区分一元 -来自二进制 -split的约束下(预期答案)。但是,也许有一个技巧可以在不向后看的情况下获得相同的结果。我经常对棘手的正则表达式解决方法感到惊讶,以至于无法相信自己的直觉。

通过几个操作,这是许多方法中的一种(请注意,第一个正则表达式替换在某种程度上模拟了后视):

console.log("-5.42+2--3*-5.5/-2+-4"
.replace(/^-|([+\-*/])-/g, "$1#")
.split(/([+\-*/])/)
.map(e => e.replace("#", "-"))
);

另一种方法是反转字符串,然后改用先行并再次反转结果。

[1] 我会添加 (or operation)在这里,什么是“操作”的问题会立即出现并完全偏离主题。同样会 (or in a beautiful way)作为基于意见的。但是,我认为例如关于使用repeated parenthesized matches这在 javascript 中是不可能的,但与 split 非常相似.

最佳答案

简答:

您不能仅使用 Regex 做您想做的事。你必须使用 Parsing expression grammar (PEG)

长答案

从您所看到的情况来看,数学表达式仅包含 termoperator。但事实上,它比这更复杂。因为 term 和特定 operator 的组合将比其他组合具有更高的优先级。所以我们要关心的不仅仅是termoperator,而是像这样的东西:

  1. 首先我们声明一个术语=一个数字或一个表达式
  2. 然后我们有一元 = 项的正值或负值
  3. 然后我们有a multiple = an unary [multiply or divide to another unary]{0 times or more}
  4. 然后我们有a sum = a multiple [add or subtract to another multiple]{0 times or more}
  5. 最后,一个表达式 = 一个总和

这是一个 + - */only 表达式的声明。包含括号运算符、运算符等的更复杂的表达式将具有更复杂的声明。您别无选择,只能使用 PEG。

所以,试试 PEGjs here .它有一个演示,说明如何实现像“2 * (3 + 4)”这样的简单表达式。

确保您可以从表达式中提取任何您想要的内容。

关于javascript - 正则表达式数学表达式单步拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45719766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com