2

我想从一个字符串中提取一个方程常数(即整数或双精度,后跟一个像“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)

然而,这不起作用。任何帮助将不胜感激,因为我已经为此工作了一个月左右。

4

4 回答 4

1

关于什么

 (?<!\^)(-|\+)?[\d.]++(?!x)

?

此变体使用所有格量词(“++”),对无效数字可能不那么严格,但如果字符串在语法上是正确的,这无关紧要。

于 2012-06-22T14:42:13.773 回答
0

您的正则表达式有什么问题是您没有 escape ^,因此它意味着字符串的开头。而且您还没有考虑以数字或小数点开头的子字符串。对于那些由一个进行的人来说也不是。因此,您的正则表达式的正确形式是:

(?<!(\\^|\\d|\\.))[+-]?(\\d+(\\.\\d+)?)(?!(x|\\d|\\.))

这工作正常。而且,如果您关心 x 上的指数,您可能想要这样:

([+-])?(\\d+(\\.\\d+)?)x(^(\d+))?

顺便说一句,你不需要在+里面逃跑[]- 当它在旁边[]

于 2012-06-22T14:00:47.417 回答
0

这应该有效:

([\\+\\-])?(\\d+(\\.\\d+)?)(?![\\d.x])

[\\d.x]有效,因为它消除了部分数字。例如:对于 30.14x,30.14 不匹配 (?!x),但 30.1 匹配。

于 2012-06-22T12:47:54.660 回答
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}|$))";
于 2012-06-22T13:32:05.480 回答