Обновление
Судя по комментариям 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