我正在尝试编写一个匹配多项式因子的正则表达式。它必须是真或假。它要么匹配,要么不匹配。例如:
(x-5)(x+2)(x-1)
当然这三个因素的顺序可以任意,但不能重复。我可以重复,但大多数时候我不能。所以我认为,如果我能在没有重复的情况下弄清楚,那么稍微调整一下以允许重复应该很容易。
这是我尝试过的:
^\(x-5\)|\(x\+2\)|\(x-1\)$
但这不允许任何顺序。我还需要它来处理更多因素。我需要按任意顺序排列任意数量的因素。有时
我应该提到我无法运行代码。我正在使用一个名为 Canvas 的在线程序。我只有一根线可以使用。它是一个自动分级机。所以我正在检查学生是否输入了正确的答案。
有什么想法吗?
最佳答案
更新
根据 OP 的评论,他们无法运行代码并且必须检查重复项,此正则表达式最多适用于 3 个因素:
^(\(x[+-]\d+\))((?!\1)(\(x[+-]\d+\))((?!(\1|\3))(\(x[+-]\d+\)))?)?$
正则表达式查找因子 \(x[+-]\d+\)
。然后它使用否定的先行 (?!\1)
和另一个因素检查这是否没有跟随相同的因素。然后它再次使用否定前瞻检查这是否没有跟在之前使用过的因素 (?!(\1|\3)
和最后的第三个因素。第二个和第三个因素是可选以允许匹配最多 3 个因素的模式。通过重复嵌套否定前瞻和因素的模式,可以将正则表达式扩展到 4 个或更多因素,并根据需要进行多次。对于 4 个因素,否定前瞻将是 (?!(\1|\3|\6))
。
原始答案
此正则表达式将处理任意数量的因素,但我认为您将不得不处理应用程序中的重复项。但是我不确定是否应该允许重复,因为(例如)(x-1)(x-1)
是 x^2- 的一组有效因子2x+1
.
^(\(x[+-]\d+\))+$
正则表达式查找任意数量的 (
后跟 x
、+
或 -
, 一些数字 (\d+
) 后跟结束符 )
。通过将正则表达式包含在 ^
和 $
中,我们确保它必须匹配整个字符串。
如果您确实想检查重复项,这就是您可以在 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!
关于regex - 任意顺序的代数因子 RegExr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53642820/