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')情况。