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