首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中拆分布尔表达式

在Java中拆分布尔表达式
EN

Stack Overflow用户
提问于 2011-01-04 21:24:56
回答 2查看 2.3K关注 0票数 3

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

代码语言:javascript
复制
String tokens[] = {"a_1", "&", "b_2", "|", "(", "!", "c_3", ")"};

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-04 21:27:45

如果你有

代码语言:javascript
复制
String str = "a & b | (!c)";

首先,去掉空格:

代码语言:javascript
复制
String str2 = str.replaceAll(" ", "");

然后,获取所需的数组,如下所示:

代码语言:javascript
复制
String[] array = str2.split("");

更新:基于OP的更改问题,另一个解决方案如下:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-01-04 21:33:51

如果您想要解析字符串--可能是create a syntax tree并计算表达式-,那么最好使用一个简单的switch表达式来解析字符串:

代码语言:javascript
复制
// 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;
}

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4594083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档