我正在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
匹配a
和z
之间的任何小写字符。 -
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"]