【发布时间】:2017-03-06 22:57:07
【问题描述】:
我有一个程序应该从控制台读取一些字符串。如果出现字符串“end”,则应该开始计算并在控制台中写入字符串。
我正在阅读的字符串是一个化学方程式。等式被这两个字符分开:->。我应该证明两边的原子数量是否相同。我找到了this 帖子并尝试实现它,但我的正则表达式有问题。
例如:
如果公式前有数字,我的正则表达式可以读取和计算化学方程式:
2 HCl + 2 Na -> 2 NaCl + H2
但如果没有数字,则计算不正确:
HCl + Na -> NaCl + H2
我的代码:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
List<String> list = new ArrayList<String>();
String input = "";
while (!(input.equals("end"))) {
input = s.nextLine();
list.add(input);
}
int before = 0;
int after = 0;
list.remove(list.size() - 1);
for (int i = 0; i < list.size(); i++) {
String string = list.get(i);
string = string.replace("-", "");
String[] splitted = string.split(">");
Pattern firstPattern = Pattern.compile("(\\d+) (\\w+)");
Matcher firstMatcher = firstPattern.matcher(splitted[0]);
while (firstMatcher.find()) {
int element = Integer.parseInt(firstMatcher.group(1));
String count = firstMatcher.group(2);
final Pattern pattern = Pattern.compile("\\d+"); // the regex
final Matcher matcher = pattern.matcher(count); // your string
final ArrayList<Integer> ints = new ArrayList<Integer>(); // results
while (matcher.find()) { // for each match
ints.add(Integer.parseInt(matcher.group())); // convert to
// int
}
for (int j = 0; j < ints.size(); j++) {
before = before + element * ints.get(j);
}
}
Pattern secondPattern = Pattern.compile("(\\d+) (\\w+)");
Matcher secondMatcher = secondPattern.matcher(splitted[1]);
while (secondMatcher.find()) {
int element = Integer.parseInt(secondMatcher.group(1));
String count = secondMatcher.group(2);
final Pattern pattern = Pattern.compile("\\d+"); // the regex
final Matcher matcher = pattern.matcher(count); // your string
final ArrayList<Integer> ints = new ArrayList<Integer>(); // results
while (matcher.find()) { // for each match
ints.add(Integer.parseInt(matcher.group())); // convert to
// int
}
for (int j = 0; j < ints.size(); j++) {
after = after + element * ints.get(j);
}
}
if (before == after) {
System.out.println("formally correct");
} else {
System.out.println("incorrect");
}
}
}
以下是一些可供尝试的示例化学方程式:
输入:
HCl + Na -> NaCl + H2
2 HCl + 2 Na -> 2 NaCl + H2
12 CO2 + 6 H2O -> 2 C6H12O6 + 12 O2
结束
输出:
不正确
正式正确
不正确
【问题讨论】:
-
您使用
\\d+,这意味着该数字重复了一次或多次。您能否尝试改用\\d*看看会发生什么? -
@Anton 它不工作它写了一个数字格式异常
-
我正在努力确保我理解问题所在。所以“2 HCl + 2 Na -> 2 NaCl + H2”是输入,结果正确吗?是“->”之后的正确信息项目原谅我,我忘记了高中化学。元素既可以是 2 个字母(NA)也可以是 1 个字母(O)?起初,我认为可能将像这样的(CO2)与空格(CO2)分开并将其包含在正则表达式中。 + 可以很好地拆分它,并且应该与差异混淆。哦,有没有 count 超过 2 位的情况?这也可能有帮助 [链接] (regexplanet.com/advanced/java/index.html)
-
我不确定到底需要什么。只是匹配前后和不匹配的数字?在“->”之前的部分?
-
@SparkleGoat 抱歉,我没有解释得这么好。 1.“2 HCl + 2 Na -> 2 NaCl + H2”是输入字符串,它是正确的。元素可以是 2 个字母或 1 个字母。如果有一个元素有 2 个字母,那么第二个字母写得很小。计数可能会上升到无限(理论上这是不可能的,但你永远不知道输入是什么)