我正在尝试编写与多项式因子匹配的正则表达式。它必须是对还是错。它要么匹配,要么不匹配。例如:
(x-5)(x + 2)(x-1)
当然,这三个因素可以是任意顺序,但不能重复。我可以重复,但大多数时候我不能重复。因此,我认为,如果我能在没有重复项的情况下解决问题,那么稍微调整一下以允许重复项应该很容易。
这是我尝试过的:
^ \(x-5 \)| \(x \ +2 \)| \(x-1 \)$
但这不允许任何顺序。我还需要使用它来处理更多因素。我需要以任意顺序包含任意数量的因素。有时
我应该提到我无法运行代码。我正在使用一个名为Canvas的在线程序。我只有一条线可以使用。这是一台自动平地机。因此,我正在检查学生是否输入了正确的答案。
有什么想法吗?
答案 0 :(得分:1)
更新
根据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!
答案 1 :(得分:0)
您可以尝试以下正则表达式:
(\([^\)]*\))
这将捕获以(
开头的所有内容,以及不是)
的内容和最后一个)
的内容。
这样做的好处是它不依赖于变量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))] )