2

我有以下方法,用于在处理乘法时将括号和星号插入布尔表达式。例如,输入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();
    }

您的帮助将不胜感激。先感谢您!:)

4

2 回答 2

0

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

于 2013-11-07T04:17:15.217 回答
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());
}

它的工作原理如下:正则表达式 [AZ]'? 将匹配一个来自 AZ 的字母(所有大写字母),它后面可以跟一个可选的撇号,所以它可以方便地为我们处理是否有撇号。正则表达式 [AZ]'?(?=[AZ]'?) 则表示“查找大写字母后跟选项撇号,然后查找(但不匹配)大写字母后跟选项撇号。这将是您要放置星号的所有位置。然后我们创建一个匹配器并找到与之匹配的所有字符。然后我们插入星号。由于我们修改了字符串,因此我们需要更新匹配器以使其功能正常。

在第二遍中,我们使用正则表达式 ([AZ]'?[*])+[AZ]'? 它将查找“一个大写字母后跟一个选项撇号,然后是一个星号至少一次,然后是一个大写字母跟一个选项撇号”。这就是括号中的所有组所在的位置。所以我们创建了一个 Matcher 并找到匹配项。然后我们检查那里是否已经有一个 parentese (确保不要超出界限)。如果没有,我们添加一个。由于我们插入了字符,我们再次需要更新 Matcher。一旦这结束了,我们就有了最后的字符串。

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

于 2013-11-07T05:03:00.450 回答