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

Ste*_*e28 2 javascript regex primes

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

isPrime=n=>!/^.$|^(..+)\1+$/.test(Array(n+1));
Run Code Online (Sandbox Code Playgroud)

我可以理解 RegExp 的事情,但我无法理解这是如何工作的。

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

Cer*_*nce 6

首先,正则表达式正在针对Array(n+1)). 当.test传递一个非字符串时,它会被转换为一个字符串。

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

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

现在,有趣的一点:正则表达式。第一部分是^.$,当输入为 1 时的一个小例子。这并不重要,所以请随意忽略它。

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

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

在通俗语言中,初始捕获组将匹配 2 个或更多字符,然后该捕获组将总共重复 2 次或更多次,并且完全匹配将跨越字符串的整个长度。

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

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

素数 5 无法匹配,因为字符串没有子片段,重复子片段 N 次(其中 N 为 2 或更多)将导致 5。

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