任意顺序RegExr的代数因子

时间:2018-12-06 00:24:34

标签: regex

我正在尝试编写与多项式因子匹配的正则表达式。它必须是对还是错。它要么匹配,要么不匹配。例如:

  

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

当然,这三个因素可以是任意顺序,但不能重复。我可以重复,但大多数时候我不能重复。因此,我认为,如果我能在没有重复项的情况下解决问题,那么稍微调整一下以允许重复项应该很容易。

这是我尝试过的:

  

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

但这不允许任何顺序。我还需要使用它来处理更多因素。我需要以任意顺序包含任意数量的因素。有时

我应该提到我无法运行代码。我正在使用一个名为Canvas的在线程序。我只有一条线可以使用。这是一台自动平地机。因此,我正在检查学生是否输入了正确的答案。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

更新

根据OP的评论,即它们不能运行代码并且必须检查重复项,此正则表达式最多可用于3个因素:

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

正则表达式查找因子\(x[+-]\d+\)。然后,它使用负的前瞻(?!\1)和另一个因素来检查是否没有跟随相同的因素。然后,它再次使用负前瞻(?!(\1|\3)来检查是否没有先前使用的因素,最后是第三个因素。第二和第三个因素是可选的,以允许最多匹配3个因素的模式。通过重复嵌套负前瞻模式和因子所需的次数,可以将正则表达式扩展到4个或更多因子。对于4个因素,负前瞻为(?!(\1|\3|\6))

Updated demo on regex101

原始答案

此正则表达式将处理任意数量的因素,但我认为您将不得不处理应用程序中的重复项。但是,我不确定无论如何都不允许重复,因为(x-1)(x-1)x^2-2x+1的有效因子集。

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

正则表达式查找任意数量的(组,后跟x+-,后跟一些数字(\d+)结束)。通过将正则表达式包含在^$中,我们确保它必须匹配整个字符串。

Demo on 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!

Demo on 3v4l.org

答案 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))] )