Java中带有空格的正则表达式模式

时间:2019-02-13 20:41:14

标签: java regex regex-negation regex-group regex-greedy

我想确定传递给函数的字符串是有效字符串。这样做时,字符串是一个多项式字符串,它们之间必须有空格。

这些有效:

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);
    }
}

您可以看到,我的正则表达式正在接受所有有效的组而不标识空格。

谢谢!

1 个答案:

答案 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

我希望这会指引您正确的方向。