这个主要的测试功能是如何工作的?

How this prime test function works?

我在另一个编程社区看到了这个主要的测试代码。

isPrime=n=>!/^.$|^(..+)+$/.test(Array(n+1));

我能理解 RegExp 的东西,但我不明白它是如何工作的。

为什么 RegExp 测试中有空数组?为什么有效???
我搜索了它,但找不到任何信息...:(

首先,正在针对 Array(n+1)) 测试正则表达式。当 .test 传递给 non-string 时,它会转换为字符串。

String(Array(5)) 结果为 ,,,,(4 个逗号)。 String(Array(3)) 结果为 ,,(2 个逗号),依此类推。 (数组的所有元素都由 , 连接,结果是 length - 1 逗号)。

因此,isPrime(n) 导致针对由 n 逗号组成的字符串测试正则表达式。

现在,有趣的是:正则表达式。第一部分是 ^.$,当输入为 1 时的一个简单情况。这并不重要,所以请忽略它。

重要的部分是^(..+)+$:

  • ^ - 字符串开始
  • ( - 组开始
    • ..+ - 匹配 2 个或更多字符
  • ) - 组结束
  • + - 重复之前匹配的组 1 次或多次
  • $ - 字符串结束

通俗地说,初始捕获组将匹配 2 个或更多字符,然后该捕获组将总共重复 2 次或更多次,完整匹配将跨越整个字符串长度。

因此,例如,合数 4 可以通过 ,, 在第一个捕获组中匹配,并通过再次反向引用(再次匹配)该组来匹配。

合数 9 可以通过 ,,, 在第一个捕获组中匹配,并且该组被反向引用两次来匹配。

无法匹配素数5,因为没有sub-segments这样的字符串重复sub-segmentN次(其中N为2或更多)会得到5.

因此,如果字符串是复合字符串,则整个正则表达式 /^.$|^(..+)+$/ 将针对该字符串执行。反转该测试,您将检查重复逗号的数量是否为素数。