这个主要的测试功能是如何工作的?
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.
因此,如果字符串是复合字符串,则整个正则表达式 /^.$|^(..+)+$/
将针对该字符串执行。反转该测试,您将检查重复逗号的数量是否为素数。
我在另一个编程社区看到了这个主要的测试代码。
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.
因此,如果字符串是复合字符串,则整个正则表达式 /^.$|^(..+)+$/
将针对该字符串执行。反转该测试,您将检查重复逗号的数量是否为素数。