Java 拆分计算器的输入字符串
我正在尝试拆分用户为我的计算器提供的输入。 例如Java 拆分计算器的输入字符串,java,string,split,expression,Java,String,Split,Expression,我正在尝试拆分用户为我的计算器提供的输入。 例如 如果用户输入“23+45*(1+1)”,我希望将其拆分为[23,+,45,*,(,1,+,1,)。您所寻找的是一个lexer。lexer将输入拆分为块(称为令牌),您可以读取这些块 幸运的是,您的lexer非常简单,可以手工编写。对于更复杂的词法分析器,您可以使用(如“快速词法分析器”——而不是Adobe Flex),或者(因为您使用的是Java)(注意,ANTLR不仅仅是一个词法分析器) 简单地列出一个正则表达式列表,每个标记对应一个正则表达式
如果用户输入“23+45*(1+1)”,我希望将其拆分为[23,+,45,*,(,1,+,1,)。您所寻找的是一个lexer。lexer将输入拆分为块(称为令牌),您可以读取这些块 幸运的是,您的lexer非常简单,可以手工编写。对于更复杂的词法分析器,您可以使用(如“快速词法分析器”——而不是Adobe Flex),或者(因为您使用的是Java)(注意,ANTLR不仅仅是一个词法分析器) 简单地列出一个正则表达式列表,每个标记对应一个正则表达式(请注意,由于您的输入非常简单,您可能可以删除此列表,并将它们全部合并到一个正则表达式中。但是,对于更高级的lexer,为每个标记对应一个正则表达式会有所帮助) 然后开始一个循环:当有更多的字符需要解析时,遍历每个正则表达式并尝试将它们与字符串的开头匹配。如果匹配,则将第一个匹配的组添加到输入列表中。否则,继续匹配(如果它们都不匹配,则告诉用户它们有语法错误) 伪代码:
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;
}
}
}
Listinput=newlinkedlist();
while(userInputString.length()>0){
用于(最终模式p:myRegexes){
最终匹配器m=p.Matcher(userInputString);
if(m.find()){
input.add(m.group());
//从用户的输入字符串中删除我们找到的令牌,以便
//可以将字符串的其余部分与正则表达式匹配。
userInputString=userInputString.substring(m.group().length());
打破
}
}
}
实施说明:
- 您可能希望在所有正则表达式前面加上
字符。这确保您将匹配项锚定在字符串的开头。我的伪代码假设您已经这样做了^
- 这可能有点草率,因为我还在学习,但它确实将它们分割成了字符串
公共类TestClass{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
ArrayList<String> separatedInput = new ArrayList<String>();
String input = "";
System.out.print("Values: ");
input = sc.next();
if (input.length() != 0)
{
boolean numberValue = true;
String numbers = "";
for (int i = 0; i < input.length(); i++)
{
char ch = input.charAt(i);
String value = input.substring(i, i+1);
if (Character.isDigit(ch))
{ numberValue = true; numbers = numbers + value; }
if (!numberValue)
{ separatedInput.add(numbers); separatedInput.add(value); numbers = ""; }
numberValue = false;
if (i == input.length() - 1)
{
if (Character.isDigit(ch))
{ separatedInput.add(numbers); }
}
}
}
System.out.println(separatedInput);
}
publicstaticvoidmain(字符串[]args)
{
扫描仪sc=新的扫描仪(System.in);
ArrayList separatedInput=新的ArrayList();
字符串输入=”;
系统输出打印(“值:”);
输入=sc.next();
如果(input.length()!=0)
{
布尔numberValue=true;
字符串编号=”;
对于(int i=0;i
}我认为使用堆栈拆分操作数和运算符并计算表达式更合适。在计算器中,我们通常使用中缀符号来定义算术表达式
Operand1 op Operand2
检查在许多此类情况下用于解析数学表达式的。也是一本好书
Operand1 op Operand2