在Java中拆分布尔表达式

在Java中拆分布尔表达式,java,string,split,expression,Java,String,Split,Expression,如何在Java中拆分布尔表达式?例如,我想从表达式a_1&b_2|(!c_3)中得到以下内容: 变量的名称包含字母数字字符和下划线(\u)。如果您有 String str = "a & b | (!c)"; 首先,去掉空格: String str2 = str.replaceAll(" ", ""); 然后,按如下方式获取所需的阵列: String[] array = str2.split(""); 更新:根据OP的更改问题,另一个解决方案如下: String str = "a_1

如何在Java中拆分布尔表达式?例如,我想从表达式
a_1&b_2|(!c_3)
中得到以下内容:

变量的名称包含字母数字字符和下划线(
\u
)。

如果您有

String str = "a & b | (!c)";
首先,去掉空格:

String str2 = str.replaceAll(" ", "");
然后,按如下方式获取所需的阵列:

String[] array = str2.split("");
更新:根据OP的更改问题,另一个解决方案如下:

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
}
String str=“a_1&b_2(!c_3)”;//初始字符串
StringCharacterIterator sci=新的StringCharacterIterator(str);//我们使用字符串迭代器对每个字符进行迭代
列表字符串=新建ArrayList();//这将是我们最后的字符串数组
StringBuilder sb=新的StringBuilder();//提高效率的字符串生成器
for(char c=sci.first();c!=sci.DONE;c=sci.next()){
如果(c=''){
continue;//我们忽略空格
}
若否(
c=='&'||
c=='('||
c==')'||
c=='|'||
c=='!')
{
//如果我们偶然发现了一个“标记”,我们首先将之前作为变量的字符串添加到字符串数组中,然后添加标记,最后清理StringBuilder
如果(sb.length()!=0)字符串。添加(sb.toString());
String.add(String.valueOf(c));
sb=新的StringBuilder();
}
否则{
sb.append(c);//我们有一个字符,它是变量的一部分
}
}
String[]finalArray=strings.toArray(新字符串[0]);//我们将列表转换为数组
for(字符串:finalArray){
System.out.println(string);//打印出数组中的所有内容
}

如果您想要解析字符串(可能是对表达式求值),那么最好使用一个简单的开关表达式解析字符串:

// 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;
}

这只是一个显示模式的存根。您可能需要使用堆栈计算表达式。

这是一个XY问题。你认为你需要正则表达式,但你不需要。-1这是一个过于简单的解决方案,只在变量字符串只有一个字符时才有效。@Erick:而OP并没有将你所说的作为要求。因为它没有被指定为只使用一个字符的变量名,所以它也应该使用多个字符的变量名。OP并没有对它的使用加以限制。@Erick:如果需要的话,喜欢简单而不是常识possible@darioo:OP编辑了问题-现在你的答案不起作用。这是因为您没有考虑多个字符变量名。这与
是变量的一部分无关-这与长度为多个字符的变量有关。请再次查看问题。
// 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;
}