Шаблон регулярных выражений с пробелами в Java - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу определить, что строка, переданная в функцию, является допустимой строкой.При этом строка представляет собой строку полиномов, между которыми должны быть пробелы.

Это допустимо:

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 голосов
/ 14 февраля 2019

Пытаясь решить эту проблему, я случайно попал туда, где он также будет анализировать недопустимые выражения ... valid.С помощью некоторой простой логики вы можете отсеять грязные выражения, но это может сработать.Я буду продолжать проверять, смогу ли я найти лучшее решение.

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(""))

РЕДАКТИРОВАТЬ 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

Я надеюсьэто ведет вас в правильном направлении.

...