Решение для полного регулярного выражения:
(?<!\^)[-+]?\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
или нет.