Алгебраические факторы в любом порядке RegExr - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь написать регулярное выражение, которое соответствует множителю многочлена.Это должно быть правдой или ложью.Это либо соответствует, либо нет.Например:

(x-5) (x + 2) (x-1)

Конечно, эти три фактора могут быть в любом порядке, но не могут иметь дубликаты,У меня могут быть дубликаты, но большую часть времени я не могу.Поэтому я думаю, что если я смогу разобраться без дубликатов, то немного подправить их, чтобы дубликаты могли быть легкими.

Вот что я попробовал:

^ \ (x-5\) | \ (x \ +2 \) | \ (x-1 \) $

Но это не учитывает любой порядок.Мне также нужно это, чтобы работать с еще большим количеством факторов.Мне нужно иметь любое количество факторов в любом порядке.Иногда

Я должен упомянуть, что не могу запустить код.Я использую онлайн-программу Canvas.У меня есть только одна строка для работы.Это автоматический грейдер.Поэтому я проверяю, набрал ли студент правильный ответ.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вы можете попробовать следующее регулярное выражение:

(\([^\)]*\))

Это будет захватывать все, что начинается с ( плюс все, что не является ) и окончательным ).

Это имеет то преимущество, что оно не зависит от буквы переменной x.Он даже будет фиксировать неверные факторы, такие как (2x+3) (и позже их отбрасывать или правильно вычислять).

Использование этого регулярного выражения в JavaScript с match вернет массив с каждым фактором.

var pattern = /(\([^\)]*\))/g;

str = "(y-1)(y+1)"
console.log(str.match(pattern))

str = "(X+0)(X+15)(X+21)(X-3)(X+4)"
console.log(str.match(pattern))

Нет дубликатов:

Если вы хотите сохранить только один из каждого совпадения, сделайте:

factors = [... new Set(str.match(/(\([^\)]*\))/g))]

где str - ваш факторизованныйполином

str = "(x+1)(x+2)(x+1)(x+2)"

console.log( [... new Set(str.match(/(\([^\)]*\))/g))] )
0 голосов
/ 06 декабря 2018

Обновление

Судя по комментариям OP, что они не могут выполнять код и должны проверять наличие дубликатов, это регулярное выражение будет работать для 3 факторов:

^(\(x[+-]\d+\))((?!\1)(\(x[+-]\d+\))((?!(\1|\3))(\(x[+-]\d+\)))?)?$

Регулярное выражение ищет фактор \(x[+-]\d+\).Затем он проверяет, что за этим не следует тот же фактор, используя отрицательный прогноз (?!\1) и другой фактор.Затем он проверяет, что за этим не следует ни один из ранее использованных факторов, снова используя отрицательный прогноз (?!(\1|\3) и, наконец, третий фактор.Второй и третий факторы сделаны необязательными, чтобы можно было сопоставить шаблон с 3 факторами.Регулярное выражение может быть расширено до 4 или более факторов, повторяя шаблон вложенного отрицательного прогнозирования и множителя столько раз, сколько требуется.Для 4 факторов отрицательный прогноз будет (?!(\1|\3|\6)).

Обновленная демоверсия по regex101

Исходный ответ

Это регулярное выражение будет иметь дело с произвольным числом факторов, но я думаю, что вам придется иметь дело с дубликатами в вашем приложении.Однако я не уверен, что дубликаты не должны быть разрешены в любом случае, так как (например) (x-1)(x-1) является допустимым набором факторов x^2-2x+1.

^(\(x[+-]\d+\))+$

Регулярное выражение ищет произвольное числогруппы (, за которыми следуют x, + или -, некоторые цифры (\d+), за которыми следует закрытие ).Включая регулярное выражение в ^ и $, мы гарантируем, что оно должно соответствовать всей строке.

Демонстрация для regex101

Если вы хотите проверить наличиедублирует это, как вы могли бы сделать это в PHP.Он использует preg_split, чтобы разбить строку в точке между факторами (используя положительный прогноз для ) и положительный прогноз для (), а затем сравнивает счетмассива с количеством уникальных значений в массиве, чтобы определить, есть ли дубликаты:

$factors = '(x-5)(x+2)(x-1)(x+2)';
$factors = preg_split('/(?<=\))(?=\()/', $factors);
print_r($factors);
if (count($factors) != count(array_unique($factors))) {
    echo "duplicate factors found!";
};

Вывод:

Array ( 
    [0] => (x-5)
    [1] => (x+2)
    [2] => (x-1)
    [3] => (x+2) 
)
duplicate factors found!

Демонстрация на 3v4l.org

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