我想确定传递给函数的字符串是有效字符串。这样做时,字符串是一个多项式字符串,它们之间必须有空格。
这些有效:
3x^7 3445x^233 3x 34 355
0
+3x^7 x^6 +3445x^233 -3x +34355 x^2
这些无效:
+3x^7+3445x^233-3x +34355
+3x^-7+3445x^233-3x +34355
一个空格不计算在内。每个模式之间必须有一个空格。如何在不从无效字符串中选择任何项目的情况下选择有效字符串?
我已经尝试过了...
while (str.hasNext()) {
str.findInLine("([\\+-]*?\\b\\d+)x\\^([\\+-]*?\\d+\\b)"
+ "|([\\+-]*?\\b\\d+)x|([+-]*?\\d+)|\\^(\\d+)");
MatchResult m = str.match();
// When the term has a valid coefficient and power ie 3x^3
if (m.group(1) != null) {
coefficient = Integer.parseInt(m.group(1));
power = Integer.parseInt(m.group(2));
this.addTerm(coefficient, power);
}
// When the term ends in x ie 3x
else if (m.group(3) != null) {
coefficient = Integer.parseInt(m.group(3));
this.addTerm(coefficient, 1);
}
// When the term has no x ie -3
else if (m.group(4) != null) {
coefficient = Integer.parseInt(m.group(4));
this.addTerm(coefficient, 0);
}
// When the term has no coefficient ie x^3
else if (m.group(5) != null) {
power = Integer.parseInt(m.group(5));
this.addTerm(1, power);
}
}
您可以看到,我的正则表达式正在接受所有有效的组而不标识空格。
谢谢!
答案 0 :(得分:0)
在尝试解决此问题时,我不小心使它也解析了无效表达式...有效。通过一些简单的逻辑,您可以清除脏表达式,但这可能会起作用。我将继续寻找是否可以找到更好的解决方案。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
//Scanner scan = new Scanner("+3x^7 3445x^233 3x 34 355");
Scanner scan = new Scanner("+3x^7+3445x^233-3x +34355");
while (scan.hasNext()) {
String s = scan.next();
Pattern p = Pattern.compile("((?:[\\+\\-]*?)?\\d+)?x?(?:\\^(\\d+))?");
Matcher m = p.matcher(s);
while (m.find())
System.out.println(m.group());
}
}
}
这可用于查看表达式是否有效:
if(!s.matches("(?:[\\+\\-]*\\d*x?\\^?\\d*)") && !s.equals(""))
EDIT II
这是我从等式中提取“零件”的一个示例:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner("+3x^7 3445x^233 3x 34 355");
//Scanner scan = new Scanner("+3x^7+3445x^233-3x +34355");
while (scan.hasNext()) {
String s = scan.next();
if(!s.matches("(?:[\\+\\-]*\\d*x?\\^?\\d*)") && !s.equals(""))
System.exit(0);
Pattern p = Pattern.compile("(?:([\\+\\-]*?)?(\\d+))?x?(\\^(\\d+))?");
Matcher m = p.matcher(s);
while (m.find())
for(int i = 0; i < m.groupCount(); i++)
if(m.group(i) == null)
continue;
else
System.out.println(m.group(i));
}
}
}
输出:
Original:
+3x^7
Parts:
+
3
^7
Original:
3445x^233
Parts:
3445
^233
Original:
3x
Parts:
3
Original:
34
Parts:
34
Original:
355
Parts:
355
我希望这会指引您正确的方向。