在Java中对infix字符串进行象征



我正在Java中实现分流码算法,作为我的AP计算机科学课程的附带项目。我已经在JavaScript中实现了一个简单的一个,只有基本的算术表达式(加法,减法,乘法,除法,指数)。要将其分成数组,我所做的就是找到每个操作员(+-*/^)以及数字和括号,然后我在它们周围放了一个空间,然后将其分成数组。例如,将infix String 4+(3+2)将其制成4 + ( 3 + 2 ),然后在Whitespace上拆分。

但是,我觉得这种方法非常慢,并且在您开始添加数学功能时,实施越来越困难和效率低下

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

我可以为此使用Regex,但是我真的不太了解它们,而且我试图学习它们,因此,如果这是对它们的最佳解决方案,答案者可以解释一下它的作用吗?<<

尝试在正则

.split
(?<=[^.a-zA-Zd])|(?=[^.a-zA-Zd])

它将在先前或之后的任何位置将字符串分开。

  • (?<=[^.a-zA-Zd])是一个积极的外观。如果前面的字符串匹配(?<=...)中包含的子regex,则它与两个字符之间的位置匹配。
    • [^.a-zA-Zd]是一个被否定的字符类。它匹配[^...]中不包含的A 单个字符
      • .匹配字符 .
      • a-z匹配az之间的任何小写字符。
      • A-Z是相同的,但对于大写。
      • d等于[0-9],因此与任何数字匹配。
  • |等效于"或"。它使得正则匹配正则正则一半或后半部分。
  • (?=[^.a-zA-Zd])与正则上半年相同,只是它是一个正面的lookahead。它与两个字符之间的位置匹配,如果 selling 字符串与(?=...)中包含的子regex匹配。

您可以这样在Java中实现此正则罚款:

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

结果:

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

相关内容

  • 没有找到相关文章

最新更新