我想将1+40.2+(2)
之类的字符串转换为字符串数组[1, +, 40.2, +, (, 2, )]
,以便将其用作我的Calculator类中的Shunting Yard算法的参数。
输入的内容不会有空格,所以我不能只使用input.split("\\s+")
。我想出了一个涉及ArrayLists,StringBuilders和堆栈的漫长过程,但我想知道是否有更简单的方法来执行此操作。
input.split("")
无法工作,因为它会返回[1, +, 4, 0, ., 2, +, (, 2, )]
。这实际上是我当前进程的起点,我可以为它发布伪代码,如果有人感兴趣的话(尽管我实际上在实现我的伪代码时遇到了问题)。
感谢任何建议或帮助。谢谢!
答案 0 :(得分:2)
我非常喜欢第一个答案,但是如果你想按照第二条评论的建议尝试使用正则表达式,这里有一个正则表达式,它将逐个匹配你方程式中的每个元素,这样你就可以附加到你的列表中。请注意,它假定所有字符串都包含小数点数,运算符和括号。
[0-9\.]+|[+\-*/]|[()]
请注意,在字符类中,除^ - ] \之外的任何字符都是文字,因此这就是字符类看起来有点滑稽的原因。要构造相应的Java模式,请使用
Pattern.compile("[0-9\\.]+|[+\\-*/]|[()]")
示例:
String s = "1+40.2+(2)";
Pattern p = Pattern.compile("[0-9\\.]+|[+\\-*/]|[()]");
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group());
}
输出:
1
+
40.2
+
(
2
)
答案 1 :(得分:1)
replaceAll字符串方法应该能够为您提供帮助。用这个来围绕你想要用一个特殊的分割角色拉出的代币(我随意选择了':',但是你有信心赢得的任何字符/字符串实际上都在输入将起作用)。然后你可以拆分那个角色。
String s = "1+40.2+(2)";
String dividingToken = ":";
String[] sSplit = s.replaceAll("\\+", dividingToken + "+" + dividingToken)
.replaceAll("\\(", dividingToken + "(" + dividingToken)
.replaceAll("\\)", dividingToken + ")" + dividingToken)
.split(dividingToken);
for(String str: sSplit){
System.out.println(str);
}
输出:
1
+
40.2
+
(
2
)
你可以轻松地将.replaceAll循环到一系列令牌上[[" +"," - "," *",...] )你想分手。只记得添加" //"在它之前取代所有因为它们中的许多都具有特殊的正则表达式意义,而你实际上想要匹配" +"。