【发布时间】:2012-01-09 17:42:58
【问题描述】:
我正在尝试拆分用户为我的计算器提供的输入。 例如, 如果用户输入“23+45*(1+1)”,我希望将其拆分为 [23,+,45,*,(,1,+,1,)]。
【问题讨论】:
标签: java string split expression
我正在尝试拆分用户为我的计算器提供的输入。 例如, 如果用户输入“23+45*(1+1)”,我希望将其拆分为 [23,+,45,*,(,1,+,1,)]。
【问题讨论】:
标签: java string split expression
您要查找的内容称为词法分析器。 lexer 将输入拆分为您可以阅读的块(称为 tokens)。
幸运的是,您的词法分析器非常简单,可以手动编写。对于更复杂的词法分析器,您可以使用flex(如“快速词法分析器”--不是 Adobe Flex),或者(因为您使用的是 Java)ANTLR(注意,ANTLR 不仅仅是一个词法分析器)。
只需提供一个正则表达式列表,每个标记匹配一个(请注意,由于您的输入非常简单,您可能可以取消此列表并将它们全部合并到一个正则表达式中。但是,对于更多高级词法分析器,它有助于为每个标记做一个正则表达式)例如
\d+
\+
-
*
/
\(
\)
然后开始一个循环:当有更多的字符需要解析时,遍历每个正则表达式并尝试将它们与字符串的开头进行匹配。如果它们匹配,则将第一个匹配的组添加到您的输入列表中。否则,继续匹配(如果没有一个匹配,告诉用户他们有语法错误)。
伪代码:
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;
}
}
}
实施说明:
^ 字符添加到所有正则表达式中。这可以确保您将匹配项锚定在字符串的开头。我的伪代码假设你已经这样做了。【讨论】:
我认为使用 stacks 来拆分操作数和运算符并评估表达式会更合适。在计算器中我们一般使用中缀符号来定义算术表达式。
Operand1 op Operand2
检查在许多此类情况下使用的Shunting-yard algorithm 来解析数学表达式。 This 也不错。
【讨论】:
这可能有点草率,因为我还在学习,但它确实将它们拆分成字符串。
公共类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);
}
}
【讨论】: