在Java中分解布尔表达式

3
我该如何在Java中拆分布尔表达式?例如,我想从表达式a_1 & b_2 | (!c_3)中获取以下内容:
String tokens[] = {"a_1", "&", "b_2", "|", "(", "!", "c_3", ")"};

变量名只包含字母数字和下划线 (_)。

1
这是一个 XY 问题。你认为你需要正则表达式,但实际上不需要。 - Philip Potter
2个回答

5
如果您想解析字符串——可能是为了创建语法树并计算表达式——那么最好使用简单的 switch 表达式来解析字符串:
// for each char c in String
switch (c) {
  case '&': processAnd();break;
  case '|': processOr();break;
  case '!': processNot();break;
  case '(': processOpenPara();break;
  case ')': processClosePara();break;
  case ' ': break;
  default:  processVarName(); break;
}

这只是一个示例,展示了模式。你可能想使用栈来计算表达式。

1

如果你有

String str = "a & b | (!c)";

首先,去掉空格:

String str2 = str.replaceAll(" ", "");

然后,像这样获取你想要的数组:

String[] array = str2.split("");

更新: 根据提问者修改后的问题,以下是另一种解决方案:

String str = "a_1 & b_2 | (!c_3)";  // initial string

StringCharacterIterator sci = new StringCharacterIterator(str);  // we use a string iterator for iterating over each character

List<String> strings = new ArrayList<String>();  // this will be our array of strings in the end

StringBuilder sb = new StringBuilder();  // a string builder for efficiency

for(char c = sci.first(); c != sci.DONE; c = sci.next()) {
    if( c == ' ' ) {
        continue;  // we ignore empty spaces
    }


    else if( 
        c == '&' ||
        c == '(' ||
        c == ')' ||
        c == '|' ||
        c == '!') 
    {
        // if we stumble upon one of 'tokens', we first add any previous strings that are variables to our string array, then add the token and finally clean our StringBuilder

        if(sb.length() != 0) strings.add(sb.toString());
        strings.add(String.valueOf(c));
        sb = new StringBuilder();
    }
    else {
        sb.append(c);  // we have a character that's part of a variable
    }

}



String[] finalArray = strings.toArray(new String[0]);  // we turn our list to an array

for (String string : finalArray) {
    System.out.println(string);  // prints out everything in our array
}

1
-1 这是一个简化的解决方案,只适用于变量字符串只有一个字符的情况。 - Erick Robertson
2
@Erick:而且题主没有把你所说的作为要求。 - darioo
1
是的。因为它没有指定只能使用单个字符变量名,所以它也可以与多个字符变量名一起使用。OP没有对其使用施加限制。 - Erick Robertson
2
@Erick:如果可能的话,请优先考虑简单而不是常识。 - darioo
2
@darioo:OP已经编辑了问题,现在你的答案不再适用。这是因为你没有考虑到多字符变量名。这与“(”是变量的一部分无关-这与变量长度为多个字符有关。请再次查看问题。 - Erick Robertson
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接