regex - 任意顺序的代数因子 RegExr

标签 regex

我正在尝试编写一个匹配多项式因子的正则表达式。它必须是真或假。它要么匹配,要么不匹配。例如:

(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))

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

关于regex - 任意顺序的代数因子 RegExr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53642820/

相关文章:

正则表达式仅匹配某个单词

python - 取出列表中某些项目的最后一个字母

java - 将文件中的所有数字解析为 BigDecimal Java

c++ - boost 正则表达式不匹配?

java - 正则表达式匹配器在 JUnit 上工作但在 Servlet 容器上失败

java - 从字符串Java的开头和结尾删除新行/空格

javascript - 如何找到给定搜索词周围括号内的所有内容?

regex - 匹配(C)函数调用的正则表达式

Java 使用正则表达式拆分空间?

javascript - Google Apps 脚本 2 中的正则表达式