【问题标题】:Tokenizing an infix string in Java在 Java 中标记中缀字符串
【发布时间】:2014-01-28 14:39:22
【问题描述】:

我正在用 Java 实现 Shunting Yard Algorithm,作为我的 AP 计算机科学课程的一个附带项目。我用 Javascript 实现了一个简单的,只有基本的算术表达式(加法、减法、乘法、除法、求幂)。要将其拆分为一个数组,我所做的是找到每个运算符 (+-*/^),以及数字和括号,然后在它们周围放置一个空格,然后将其拆分为一个数组。例如,中缀字符串4+(3+2) 会变成4 + ( 3 + 2 ),然后在空格处分割。

但是,我觉得这种方法很慢,并且随着您开始添加数学函数(例如正弦、余弦、正切、绝对值等),实现起来变得越来越困难和效率低下。

sin(4+3)-8 之类的字符串拆分为数组["sin","(" 4,"+",3,")","-",8] 的最佳方法是什么?

我可以为此使用正则表达式,但我不太了解它们,我正在努力学习它们,所以如果这对他们来说是最好的解决方案,请回答者解释一下它的作用?

【问题讨论】:

    标签: java regex tokenize shunting-yard


    【解决方案1】:

    在正则表达式上尝试.spliting

    (?<=[^\.a-zA-Z\d])|(?=[^\.a-zA-Z\d])
    

    它将在非字母数字字符或句点之前或之后的任何位置拆分字符串。

    • (?&lt;=[^\.a-zA-Z\d])positive lookbehind。如果前面的字符串与(?&lt;=...) 中包含的子正则表达式匹配,则它匹配两个字符之间的位置。
      • [^\.a-zA-Z\d]negated character class。它匹配[^...] 中不包含的单个字符
        • \. 匹配字符 .
        • a-z 匹配 az 之间的任何小写字符。
        • A-Z 相同,但为大写。
        • \d 等同于 [0-9],因此它匹配任何数字。
    • |the equivalent of an "or"。它使正则表达式匹配正则表达式的前半部分或后半部分。
    • (?=[^\.a-zA-Z\d]) 与正则表达式的前半部分相同,只是它是 positive lookahead。如果 以下 字符串与 (?=...) 中包含的子正则表达式匹配,则它匹配两个字符之间的位置。

    你可以像这样在java中实现这个正则表达式:

    String str = "sin(4+3)-8";
    String[] parts = str.split("(?<=[^\\.a-zA-Z\\d])|(?=[^\\.a-zA-Z\\d])");
    

    结果:

    ["sin","(" 4,"+",3,")","-","8"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2014-04-16
      • 2010-09-20
      • 2011-11-28
      • 2014-07-26
      相关资源
      最近更新 更多