拆分计算器的输入字符串

sav*_*iok 5 java string expression split

我正在尝试将用户给出的输入分成我的计算器.例如,如果用户输入"23 + 45*(1 + 1)",我希望将其分成[23,+,45,*,(,1,+,1,)].

Jac*_*nds 7

你所寻找的是一个词法分析器.一个词法分析器分裂了输入块(称为令牌),您可以阅读.

幸运的是,你的词法分析器很简单,可以手工编写.对于更复杂的词法分析器,您可以使用flex(如"快速词法分析器" - 而不是Adobe Flex),或者(因为您使用的是Java)ANTLR(注意,ANTLR不仅仅是词法分析器).

只需提出一个正则表达式列表,每个令牌匹配一个(请注意,由于您的输入非常简单,您可以取消此列表并将它们合并为一个单一的正则表达式.但是,对于更高级的词法分析器,它有助于为每个令牌做一个正则表达式)例如

\d+
\+
-
*
/
\(
\)
Run Code Online (Sandbox Code Playgroud)

然后启动一个循环:当有更多要解析的字符时,请遍历每个正则表达式并尝试将它们与字符串的开头匹配.如果匹配,请将第一个匹配的组添加到输入列表中.否则,继续匹配(如果它们都不匹配,则告诉用户他们有语法错误).

伪代码:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

实施说明:

  • 您可能希望将该^字符添加到所有正则表达式中.这样可以确保将匹配项锚定在字符串的开头.我的伪代码假设你已经这样做了.