Сопоставление свободных членов в полиноме с действительными коэффициентами с использованием регулярных выражений - PullRequest
0 голосов
/ 21 марта 2019

Я должен сделать задание для методов программирования, и я изо всех сил пытался сопоставить свободные термины в полиноме (2,0x ^ 2 + 3,5x- 3,0 или 45x + 2 ), который задается в виде строки.Я пытался использовать следующее регулярное выражение:

(-{0,1}\d+(\.\d+){0,1})(?![0-9]\.*x\^\d))

Я знаю, что способ, которым я подошел к нему, может быть не слишком хорошим, но у меня не было слишком много времени для понимания регулярного выражения более сложным способом,только немного, и я застрял в точке, в которой я хотел бы получить только числа, как в формате: ± # или ± #. # , за которыми не следует: x или x ^ # , где # представляет одну или несколько цифр.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Это будет сделано: (?<!\^)(\d+(?:\.\d+)?)(?![x.\d])

(?<!     | Negative lookbehind:
  \^     |   A literal "^"
)        | Close group
(        | Capture the following:
  \d+    |   Match one or more digits
  (?:    |   Match the following group:
    \.   |     A literal "."
    \d+  |     One or more digits
  )?     |   Close group, optional match
)        | End capture
(?!      | Negative lookahead:
  [x.\d] |   Either an "x", ".", or any digit
)        | Close group

Попробуйте здесь


String s = "5x-50.1+x^2-2+20x";
Pattern p = Pattern.compile("(?<!\\^)(\\d+(?:\\.\\d+)?)(?![x.\\d])");
Matcher m = p.matcher(s);
if (m.find()){
    System.out.println(m.group(1)); // Output: 50.1
}
0 голосов
/ 21 марта 2019

Решение для полного регулярного выражения:

(?<!\^)[-+]?\d+(\.\d+)?(?=$|[-+])
  • (?<!\^) не будет совпадать, если предыдущий символ ^
  • [-+]? будет соответствовать необязательному знаку
  • \d+(\.\d+)? будет соответствовать номеру, который состоит из целочисленной части, за которой следует необязательная плавающая часть
  • (?=$|[-+]) не будет совпадать, если только последующее не является символом знака или концомстрока

Вы можете попробовать здесь .


Java-решение с сопоставлением терминов:

Pattern termPattern = Pattern.compile("\\d+(?:\\.\\d+)?(x(?:\\^\\d+)?)?");
Matcher termMatcher = termPattern.matcher(input);
while (termMatcher.find()) {
    if (termMatcher.group(1) == null) {
        // you have a free term
    }
}

Регулярное выражениесоответствует целочисленной части, за которой следует необязательная плавающая часть, а затем необязательная часть x^n, которая записывается в группу захвата.Matcher создается из применения шаблона к входу.Вызов Matcher.find позволяет нам перебирать несколько совпадений во входной строке.Для каждого совпадения мы проверяем содержимое первой группы захвата, и когда оно пустое, у нас есть свободный термин.

Вы можете попробовать здесь .


Пока чтодругим решением было бы просто разбить строку на [+-] и для каждого теста детали, содержит ли она x или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...