首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数学表达式的正则表达式

数学表达式的正则表达式
EN

Stack Overflow用户
提问于 2012-07-04 14:27:17
回答 3查看 2.5K关注 0票数 0

我需要一个数学表达式的正则表达式,它应该满足我所要求的这个SO Question中解释的以下条件。

它可以很好地使用下面的表达式

但现在我需要添加对左括号和右括号的支持,以及前面的条件。因此,我的正则表达式应该验证这些模式的表达式

例如:*6+(7-9)/6.25*(7-9.2)+6*6/(7.5-9)

我试图对现有的正则表达式进行修改,但没有成功。它还接受无效的模式*6+(7-9*6+7-9),因为单括号可以出现在数学表达式中。

这里是链接RegExr。请帮帮忙。

EN

回答 3

Stack Overflow用户

发布于 2012-07-04 14:30:46

@Bibhu,因为数学表达式可以任意嵌套,所以您需要一个实际的解析器来验证它们。正则表达式不起作用。正则表达式不足以处理任意深度的递归嵌套。

如果您将嵌套限制为最大级别,则可以编写一个(非常大且丑陋的) regexp来验证表达式。但从根本上说,regexp不适合做这项工作。

如果你有一个解析器生成器,你已经知道如何使用,这将是为数学表达式构建解析器的最简单的方法。如果您不这样做,手动编写一个简单的自上而下递归下降解析器仍然非常容易。

票数 4
EN

Stack Overflow用户

发布于 2012-07-04 14:55:33

(让你的文本变得更复杂)最好的方法是像ANTLR这样的文本识别器。

票数 0
EN

Stack Overflow用户

发布于 2012-08-13 08:45:32

我想知道你是不是在悬赏。

regex中的简单递归是一个gosub,它有一个恰好是可堆叠的通过/失败返回。

下面是一个Perl例程,它传递Perl自己的解析algol,以获取您指定的简单操作符和简单语法规则。它是在一个正则表达式中完成的,因为您的需求非常简单。

它看起来很花哨,但解析为简单的平衡文本'()‘。它看起来像是点网

可以做到这一点。做替换应该很容易(即(?&var) ),做

平衡分组点网需要...即时验证。

我之所以发布这篇文章,是因为嵌套不是问题。问题是就像这样简单

解析看起来,关键在于细节。

代码语言:javascript
运行
复制
^
(?:
     ^ (?&sign)? (?&number)
  |
     (?&operator) 
     (?<! ^ (?:\/|\*) )
     (?<! ^ [*]{2} )
     (?&sign)? (?&number)
  |
     (?: (?&operator)
         (?<! ^ (?:\/|\*) )
         (?<! ^ [*]{2} )
         (?<! [(] (?:\/|\*) )
         (?<! [(] [*]{2} )
         (?&sign)?
       |
         (?<= [(] )
       |
         ^ (?&sign)?
     )

     (?<term>
        \(
           (?:
                (?>  (?&sign)?
                     (?&number)
                     (?: (?&operator) (?&sign)? (?&number) )*
                )
             |
                (?>
                    (?: (?<= [(] ) | (?&operator) )
                    (?<! [(] (?:\/|\*) )
                    (?<! [(] [*]{2} )
                    (?&sign)?
                    (?&term)
                )
           )*
        \)
        (?! [(] )
        (?> (?&operator) (?&sign)? (?&number) )*
     )
)*
$

(?(DEFINE)
  (?<number>    \d+(?:\.\d+)?   )
  (?<sign>      [+-]            )
  (?<operator>
        (?:  [*]{2}
          |  [\/*]
          |  (?<pm>[-+]) (?! \k<pm>) )
         )
  )

输出

代码语言:javascript
运行
复制
passed  ''
passed  '(6**-2**3)'
passed  '6-+2'
passed  '-(-(8*((2)/3)))'
passed  '-((8*((2)/3)))'
passed  '-((8*((2**4)/3)))'
passed  '-((8*((2**4)/3)))**((-1)*(8*((2**4/99)/3)))'
passed  '-((8*((2**4)/3)))**((-1)*(8*((2**-4/99)/3)))'
passed  '-((8*((2**4)/3)))**-((-1)*(8*((2**-4/99)/3)))'
passed  '((8*((2)/3)))'
passed  '((8*((2)/3)))'
passed  '+((8*((-2)/-3)))'
passed  '8-6*2'
passed  '-8-6*2'
passed  '((8*((2-(8*(8+6)/2))/3))-7*2/234)+8/2*1'
passed  '-(8*(8+6)/2)'
passed  '(9*9/9)'
passed  '(9*(9)/9*(9*(9)/9)*1)'
passed  '(9*(9)/9*(9*(9)/9))*(9*(9)/9*(9*(9)/9))'

failed  '(6--2)'
failed  '-(/(8*((2)/3)))'
failed  '-((8*((2(6))/3)))'
failed  '+((8*((+2)/--3)))'
failed  '+((8*((+2)/--3+)))'
failed  '+((8*((*2)/--3)))'
failed  '+((8*((*2)/-3)))'
failed  '-((8*((-2)/+-3)))'
failed  '+8/2(1)'
failed  '-(8)*(8/('
failed  '-(8)*(8/()'
failed  '*(9*9/9)'
failed  '*(9*(9)/9*(9*(9)/9))*(9*(9)/9*(9*(9)/9))'
failed  '/(9*(9)/9*(9*(9)/9))*(9*(9)/9*(9*(9)/9))'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11323493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档