Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据某些条件在字符串中插入括号和星号_Java_String_Boolean Expression - Fatal编程技术网

Java 根据某些条件在字符串中插入括号和星号

Java 根据某些条件在字符串中插入括号和星号,java,string,boolean-expression,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) {

我有下面的方法,在处理乘法时,该方法用于在布尔表达式中插入括号和星号。例如,输入
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();
    }
公共静态字符串修改(字符串表达式)
{
字符串temp=表达式;
StringBuilder已验证=新建StringBuilder();
布尔内布拉克=假;

对于(int idx=0;idx我建议您应该从字符串中
+
字符的位置开始。如果它们相差1,则什么也不做。如果它们相差2,则有两种可能性:
AB
A'
。因此您可以检查它。如果它们相差超过2,则只需检查
'
符号并输入req即可uired符号。

您可以使用正则表达式在两次过程中完成此操作:

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());
}
它的工作原理如下:regex[A-Z]'?将匹配A-Z中的一个字母(所有大写字母),并且可以后跟一个可选的撇号,因此它可以方便地为我们考虑是否有撇号。regex[A-Z]'(?=[A-Z]'?)则表示“查找一个大写字母,后跟一个可选撇号,然后查找(但不要匹配)一个大写字母,后跟一个选项撇号。这将是您希望在其后面放置星号的所有位置。然后我们创建一个匹配器,并找到与之匹配的所有字符。然后我们插入星号。由于我们修改了字符串,我们需要更新匹配器以使其正常工作

在第二步中,我们使用正则表达式([A-Z]'?[*])+[A-Z]'?它将查找“一个大写字母,后跟一个选项撇号,然后是一个星号,至少查找一次,然后是一个大写字母,后跟一个选项撇号“。这是括号中的所有组都需要处于谎言状态的地方。因此,我们创建一个匹配器并找到匹配项。然后检查是否已经存在parentese(确保不越界)。如果没有,我们添加一个。我们再次需要更新匹配器,因为我们插入了字符。一旦完成,我们就有了或最后一个字符串。”

有关regex的更多信息:


您能发布您得到的错误吗…?乍一看,您似乎无法处理第一个字符是括号的(A+B)“+(C'D')情况。