Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 数学表达式的正则表达式_Regex - Fatal编程技术网

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

Regex 数学表达式的正则表达式,regex,Regex,我需要一个正则表达式来表示一个数学表达式,它应该满足我要求的以下条件 它与这个表达式配合得很好 但是现在我需要添加对开始括号和结束括号的支持以及前面的条件。所以我的正则表达式应该验证这些模式的表达式 例如*6+(7-9)或/6.25*(7-9.2)或+6或*6/(7.5-9) 我试图对现有的正则表达式进行修改,但未能成功实现。它还接受无效的模式*6+(7-9和*6+7-9),因为数学表达式中可能存在单括号 这是链接。请帮忙 @Bibhu,因为数学表达式可以任意嵌套,所以需要实际的解析器来验证它们

我需要一个正则表达式来表示一个数学表达式,它应该满足我要求的以下条件

它与这个表达式配合得很好

但是现在我需要添加对开始括号和结束括号的支持以及前面的条件。所以我的正则表达式应该验证这些模式的表达式

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

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


这是链接。请帮忙

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

如果将嵌套限制在最大级别,则可以编写一个(非常大且难看的)regexp来验证表达式。但从根本上说,regexp是执行此任务的错误工具


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

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

如果将嵌套限制在最大级别,则可以编写一个(非常大且难看的)regexp来验证表达式。但从根本上说,regexp是执行此任务的错误工具


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

(通过使文本有趣可能更复杂)最好的方法是像文本识别器一样的。

(通过使文本有趣可能更复杂)最好的方法是像文本识别器一样的。

我想知道你是否在提供赏金

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

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

它看起来很花哨,但最终归结为简单的平衡文本“()”。它看起来像点网
我能做到这一点。只做代换(即,(?&var)),do
平衡分组点网需要。。。即时验证

我发布这篇文章是因为,嵌套不是问题。问题是像
似乎,魔鬼就在细节中

^
(?:
     ^ (?&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>) )
         )
  )

我想知道你是否提供赏金

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

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

它看起来很花哨,但最终归结为简单的平衡文本“()”。它看起来像点网
我能做到这一点。只做代换(即,(?&var)),do
平衡分组点网需要。。。即时验证

我发布这篇文章是因为,嵌套不是问题。问题是像
似乎,魔鬼就在细节中

^
(?:
     ^ (?&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>) )
         )
  )

不,你不能用正则表达式。编写一个小型解析器。您使用哪个正则表达式引擎?这只能通过支持递归的正则表达式引擎(如.NET或Perl)来完成,即使这样,它也将是一个非常复杂的正则表达式。真正的解析器将更易于维护。@Tim Pietzcke-我在asp.NET应用程序中使用正则表达式来验证文本框的文本。在这种情况下,你的建议是什么?不,你不能使用正则表达式。编写一个小型解析器。您使用哪个正则表达式引擎?这只能通过支持递归的正则表达式引擎(如.NET或Perl)来完成,即使这样,它也将是一个非常复杂的正则表达式。真正的解析器将更易于维护。@Tim Pietzcke-我在asp.NET应用程序中使用正则表达式来验证文本框的文本。在这种情况下,你的建议并不完全正确。目前几乎没有任何“regex”引擎仅限于实际的“正则”表达式。许多确实支持递归。除了这个事实,这更多的是一个评论而不是一个答案。@TimPietzcker,谢谢你指出这一点。事实上,我知道一些正则表达式引擎支持递归,并且已经在上面发布了答案,在此之前我提到了这一事实。在这种情况下,我认为递归下降解析器是最好的解决方案,我不想混淆这个问题。如果您想发布一个答案,演示如何使用“非正则表达式”解决问题,请这样做。你需要找出OP使用的是什么语言来获得正确的语法。这就是为什么我写了我对比布问题的评论。至少,RegExr似乎不支持递归regex…@Alex D-我在asp.net应用程序中使用正则表达式验证文本框的文本。在这种情况下,你的建议并不完全正确。目前几乎没有任何“regex”引擎仅限于实际的“正则”表达式。许多确实支持递归。除了这个事实,这更多的是一个评论而不是一个答案。@TimPietzcker,谢谢你指出这一点。事实上,我知道一些正则表达式引擎支持递归,并且之前已经发布了关于递归的答案