根据某些条件将括号和星号插入字符串

时间:2013-11-07 03:18:01

标签: java string boolean-expression

我有以下方法用于在处理乘法时将括号和星号插入布尔表达式。例如,A+B+AB的输入将提供A+B+(A*B)

但是,我还需要考虑素数(撇号)。以下是输入/输出的一些示例:

A'B'+CD应该(A'*B')+(C*D)

A'B'C'D'应该(A'*B'*C'*D')

(A+B)'+(C'D')应该(A+B)'+(C'*D')

我尝试过以下代码,但似乎有错误。有什么想法吗?

public static String modify(String expression)
    {
        String temp = expression;
        StringBuilder validated = new StringBuilder();
        boolean inBrackets=false;

        for(int idx=0; idx<temp.length()-1; idx++)
        {
            //no prime
            if((Character.isLetter(temp.charAt(idx))) && (Character.isLetter(temp.charAt(idx+1))))
            {
                if(!inBrackets)
                {
                    inBrackets = true;
                    validated.append("(");
                }
                validated.append(temp.substring(idx,idx+1));
                validated.append("*");
            }

            //first prime
            else if((Character.isLetter(temp.charAt(idx))) && (temp.charAt(idx+1)=='\'') && (Character.isLetter(temp.charAt(idx+2))))
            {
                if(!inBrackets)
                {
                    inBrackets = true;
                    validated.append("(");
                }
                validated.append(temp.substring(idx,idx+2));
                validated.append("*");
                idx++;
            }

            //second prime
            else if((Character.isLetter(temp.charAt(idx))) && (temp.charAt(idx+2)=='\'') && (Character.isLetter(temp.charAt(idx+1))))
            {
                if(!inBrackets)
                {
                    inBrackets = true;
                    validated.append("(");
                }
                validated.append(temp.substring(idx,idx+1));
                validated.append("*");
                idx++;
            }

            else
            {
                validated.append(temp.substring(idx,idx+1));
                if(inBrackets)
                {
                    validated.append(")");
                    inBrackets=false;
                }
            }
        }
        validated.append(temp.substring(temp.length()-1));
        if(inBrackets)
        {
            validated.append(")");
            inBrackets=false;
        }
        return validated.toString();
    }

非常感谢您的帮助。先感谢您! :)

2 个答案:

答案 0 :(得分:0)

我建议您应该从字符串中的+字符开头。如果他们相差1,你什么都不做。如果它们相差2,则有两种可能性:ABA'。所以你检查一下。如果它们的差异超过2,那么只需检查'符号并输入所需的符号。

答案 1 :(得分:0)

你可以使用正则表达式进行2次传递:

StringBuilder input = new StringBuilder("A'B'+(CDE)+A'B");

Pattern pattern1 = Pattern.compile("[A-Z]'?(?=[A-Z]'?)");
Matcher matcher1 = pattern1.matcher(input);
while (matcher1.find()) {
    input.insert(matcher1.end(), '*');
    matcher1.region(matcher1.end() + 1, input.length());
}
Pattern pattern2 = Pattern.compile("([A-Z]'?[*])+[A-Z]'?");
Matcher matcher2 = pattern2.matcher(input);
while (matcher2.find()) {

    int start = matcher2.start();
    int end = matcher2.end();
    if (start==0||input.charAt(start-1) != '(') {
        input.insert(start, '(');
        end++;
    }
    if (input.length() == end || input.charAt(end) != ')') {
        input.insert(end, ')');
        end++;
    }
    matcher2.region(end, input.length());
}

它的工作原理如下:正则表达式[A-Z]&#39 ;?将匹配来自A-Z的字母(所有大写字母),然后可以跟随一个可选的撇号,因此它可以方便地处理我们是否有撇号。正则表达式[AZ]&#39;?(?= [AZ]&#39;?)然后意味着&#34;寻找大写字母后跟一个选项撇号然后寻找(但不要匹配)反对)大写字母后跟一个选项撇号。这将是您想要填写星号的所有地方。然后我们创建一个Matcher并找到与之匹配的所有字符。然后我们插入星号。由于我们修改了字符串,因此我们需要更新Matcher以使其正常运行。

在第二遍中,我们使用正则表达式([A-Z]&#39;?[*])+ [A-Z]&#39;?它将寻找&#34;大写字母后跟一个选项撇号,然后是星号至少一次,然后是大写字母,然后是一个选项撇号&#34;。这是括号中所有群体需要排除的地方。所以我们创建一个Matcher并找到匹配项。然后我们检查一下是否已经有一个肠衣(确保不要超出界限)。如果不是,我们添加一个。我们再次需要更新Matcher,因为我们插入了字符。一旦结束,我们就有了最后的字符串。

有关正则表达式的更多信息: