【问题标题】:tokenizing mathematical equation using regex使用正则表达式标记数学方程
【发布时间】:2017-01-12 20:10:33
【问题描述】:

我正在尝试将方程式字符串拆分为标记。我找到了一个很好的起点 '([A-Za-z]+|[0-9.]+|[&=>

turns: '5--4=sin(2+3)'
into: ['5','-','-','4','=','sin','(','2','+','3',')']
want: ['5','-','-4','=','sin','(','2','+','3',')']

还有

turns: -3+3
into: ['-','3','+','3']
want: ['-3','+','3']

看起来我的正则表达式可以使用一些东西来检查'-'左边是否有一个数字,如果没有将它与下一个数字保持一致(注意'-3'左边没有任何东西)。可以使用正则表达式完成吗?还是有更好的工具在.NET 中拆分它?

【问题讨论】:

    标签: .net regex tokenize evaluation


    【解决方案1】:

    您没有正确解决问题。你实际得到的结果正确的。

    -3+3 应该解析为:

    operator binary +
    |
    +-- operator unary -
    |   |
    |   +-- 3
    |
    +-- 3
    

    这样更容易推理数学表达式,您将避免许多歧义。让- 始终作为自己的标记,并将其用作二元减号或一元否定运算符。

    请参阅here 了解我的相关答案,它以这种方式解决问题(它使用 ANTLR,但词法分析完全符合我的建议)。

    【讨论】:

      【解决方案2】:

      正则表达式的功能不够强大,无法在所有情况下做你想做的事。尽管您可以使正则表达式将+- 识别为整数文字的一部分,例如,通过在数字序列前面添加可选的[+-]?,生成的正则表达式将选择将'-3+3' 标记为@987654326 @ (demo)。

      使用词法分析器应该可以解决这个问题;或者,您可以在 解析器 中处理“捆绑”一元运算符及其操作数。

      【讨论】:

      • 哦,来吧,正则表达式非常适合词法分析 - 这是乔姆斯基 3 型问题。 OP 没有意识到他得到的结果实际上是正是他需要的。在-3 中,- 实际上是一元否定运算符。
      • @LucasTrzesniewski 当然,正则表达式非常适合词法分析,但 OP 希望他的词法分析是上下文相关的。他希望-3-3 中的两个缺点被区别对待,这既不是他想要的,也不是正则表达式可以提供的。
      • 是的,在第二次阅读您的答案后,我明白了您的意思。顺便说一句,词法分析器生成器也不会神奇地解决“问题”,大多数只是在引擎盖下使用正则表达式;)
      • @LucasTrzesniewski 我想到了 ANTLR 3:我记得它为我在词法复杂表达式方面产生了一些不错的“魔法”。不过,我认为他们通过在正则表达式的“智能”顶部添加一个额外的层来做到这一点。
      • 嗯...据我所知,ANTLR 中没有这样的东西。它允许您通过使用内联块{...} 或谓词{...}? 将代码注入到词法分析器表达式中(我不记得v3 词法分析器是否使用了{...}?{...}?=>),因此您可以通过这种方式实现自定义魔法.
      猜你喜欢
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多