【发布时间】:2014-06-23 09:17:41
【问题描述】:
我有以下字符串,并想在我的字符串中跟踪 ROUND( ) 的右括号。
"=ROUND(IF(AND($BY18=2);CA18*CB18/$M$11;IF($BY18=3;CA18*CB18/$M$10;IF($BY18=4;ROUND(CA18*CB18;$M$10)/$M$9;CA18*CB18)))/$M$12;$M$11)";
public class RoundParser {
public static String parseRound(String text) {
text = text.toUpperCase();
String result;
char[] ch = text.toCharArray();
int count = -1;
String temp = "";
for (int i = 0; i < ch.length; i++) {
temp = temp + ch[i];
System.out.println(count);
if ("ROUND(".equals(temp)) {
count++;
}
if ("(".equals(temp)) {
count++;
}
if (")".equals(temp) && count > 0) {
count--;
}
if (")".equals(temp) && count == 0) {
ch[i] = '#';
}
if (!"ROUND(".startsWith(temp) || temp.length() > 5) {
temp = "";
}
}
text = String.valueOf(ch);
result = text;
return result;
}
public static void main(String[] args) {
String text = "=ROUND(IF(AND($BY18=2);CA18*CB18/$M$11;IF($BY18=3;CA18*CB18/$M$10;IF($BY18=4;ROUND(CA18*CB18;$M$10)/$M$9;CA18*CB18)))/$M$12;$M$11)";
System.out.println(parseRound(text));
}
}
但是,目前我正在使用我的解析器:
=ROUND(IF(AND($BY18=2);CA18*CB18/$M$11;IF($BY18=3;CA18*CB18/$M$10;IF($BY18=4;ROUND(CA18*CB18;$M$10)/$M$9;CA18*CB18))#/$M$12;$M$11#
我想要得到的输出是:
=ROUND(IF(AND($BY18=2);CA18*CB18/$M$11;IF($BY18=3;CA18*CB18/$M$10;IF($BY18=4;ROUND(CA18*CB18;$M$10#/$M$9;CA18*CB18)))/$M$12;$M$11#
如您所见,不正确的 ) 被替换为 ;$M$11)"; 和 ;$M$10)。如果您知道如何替换这两种情况,我将不胜感激。
【问题讨论】:
-
如果反向开始,遇到的第一个“)”将是最后一个“)”
-
你必须实现一个for循环并且只检查')'并同时存储它的位置,这样你就可以得到最后一个')'的位置。
-
@TheLostMind 感谢您的回答!请举个例子!
-
更具体地说明您想要做什么...跟踪最后一个 ')' 或跟踪 ROUND 的右括号?
-
@Kare - 坦率地说..我没有完全得到你的问题..你想做什么?给出示例输入和输出..