我有以下方法用于在处理乘法时将括号和星号插入布尔表达式。例如,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();
}
非常感谢您的帮助。先感谢您! :)
答案 0 :(得分:0)
我建议您应该从字符串中的+
字符开头。如果他们相差1,你什么都不做。如果它们相差2,则有两种可能性:AB
或A'
。所以你检查一下。如果它们的差异超过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,因为我们插入了字符。一旦结束,我们就有了最后的字符串。
有关正则表达式的更多信息: