我想从一个字符串中提取一个方程常数(即整数或双重后跟一个像“x”之类的字母)。
例如eqn = "30.14x^2 + 55.69x + 60.1 = 100"
。
到目前为止,我可以使用
x
的系数
([\\+\\-])?(\\d+(\\.\\d+)?)x
在这种情况下给出55.69x or 30.14x
。
现在我想获得常量,我在下面尝试使用正则表达式提取+60.1或100
(?<!^)([\\+\\-])?(\\d+(\\.\\d+)?)(?!x)
然而,这不起作用。任何帮助都会受到高度赞赏,因为我已经有一个月左右了。
答案 0 :(得分:1)
怎么样
(?<!\^)(-|\+)?[\d.]++(?!x)
此变体使用所有格量词(“++”),对无效数字可能不那么严格,但如果字符串在语法上是正确的,则无关紧要。
答案 1 :(得分:0)
这应该有效:
([\\+\\-])?(\\d+(\\.\\d+)?)(?![\\d.x])
[\\d.x]
有效,因为它消除了部分数字。例如:对于30.14x,30.14与(?!x)
不匹配,但30.1将匹配。
答案 2 :(得分:0)
这是一种在几次传递中提取这些值的方法:
public static void main(String[] args) {
String eqn = "30.14x^2 + 55.69x + 60.1 = 100";
String numberRegex = "[\\d]+(?:[\\.]{1}[\\d]+)?";
String symbolsRegex = "=+-/\\\\*\\^";
String coefRegex = "("+numberRegex+")([a-z]{1})";
Pattern p = Pattern.compile(coefRegex);
Matcher m = p.matcher(eqn);
while (m.find()) {
System.out.println("coefficient: " + m.group(1) + " -- " + m.group(2));
}
String constRegexp = "([^ " + symbolsRegex + "]" + numberRegex + "(?:[ ]{1}|$))";
p = Pattern.compile(constRegexp);
m = p.matcher(eqn);
while (m.find()) {
System.out.println("constant: " + m.group(1));
}
}
输出:
coefficient: 30.14 -- x
coefficient: 55.69 -- x
constant: 60.1
constant: 100
只是添加我上面使用的正则表达式的文字值:
String coefRegex = "([\\d]+(?:[\\.]{1}[\\d]+)?)([a-z]{1})";
String constRegexp = "([^ =+-/\\\\*\\^][\\d]+(?:[\\.]{1}[\\d]+)?(?:[ ]{1}|$))";
答案 3 :(得分:0)
你的正则表达式有什么问题,你没有逃脱^
,因此它意味着字符串的开头。而且你还没有考虑前面有数字或小数点的子串。对于那些由一个进行的那些都没有。因此,正则表达式的正确形式将是:
(?<!(\\^|\\d|\\.))[+-]?(\\d+(\\.\\d+)?)(?!(x|\\d|\\.))
哪作得好。如果你关心x上的指数,你可能想要这样:
([+-])?(\\d+(\\.\\d+)?)x(^(\d+))?
顺便说一下,+
内[]
和-
[
]
旁边的{{1}}。{ / p>