List<String>input = new LinkedList<String>();
while(userInputString.length()>0){
for (final Pattern p : myRegexes){
final Matcher m = p.matcher(userInputString);
if(m.find()) {
input.add(m.group());
//Remove the token we found from the user's input string so that we
//can match the rest of the string against our regular expressions.
userInputString=userInputString.substring(m.group().length());
break;
}
}
}
# 1 楼答案
这可能有点草率,因为我还在学习,但它确实将它们分割成了字符串
公共类TestClass{
}
# 2 楼答案
你要找的是一个叫lexer的。lexer将输入分割成块(称为标记),您可以读取
幸运的是,您的lexer非常简单,可以手工编写。对于更复杂的词法分析器,您可以使用^{} (如“快速词法分析器”中的“非Adobe Flex”),或者(因为您使用的是Java)ANTLR(注意,ANTLR不仅仅是一个词法分析器)
简单地列出一个正则表达式列表,每个标记对应一个正则表达式(请注意,由于您的输入非常简单,您可能可以删除此列表,并将它们全部合并到一个正则表达式中。但是,对于更高级的lexer,为每个标记对应一个正则表达式会有所帮助)
然后开始一个循环:当有更多的字符需要解析时,遍历每个正则表达式并尝试将它们与字符串的开头匹配。如果匹配,则将第一个匹配的组添加到输入列表中。否则,继续匹配(如果它们都不匹配,则告诉用户它们有语法错误)
伪代码:
实施说明:
^
字符。这确保您将匹配项锚定在字符串的开头。我的伪代码假设您已经这样做了李># 3 楼答案
我认为使用堆栈拆分操作数和运算符并计算表达式更合适。在计算器中,我们通常使用中缀符号来定义算术表达式
检查在许多此类情况下使用的Shunting-yard algorithm来解析数学表达式This也是一本好书