问题描述
isPrime=n=>!/^.$|^(..+)\1+$/.test(Array(n+1));
我能理解RegExp,但是我不明白这是如何工作的。
为什么在RegExp测试中包含空数组?以及为什么有效??
我搜索了它,但找不到任何信息...:(
解决方法
首先,要对Array(n+1))
进行正则表达式测试。当.test
传递非字符串时,它将被强制转换为字符串。
String(Array(5))
产生,
(4个逗号)。 String(Array(3))
产生,
(两个逗号),依此类推。 (数组的所有元素都由,
连接,产生length - 1
逗号)。
因此,isPrime(n)
导致正则表达式针对由n
逗号组成的字符串进行测试。
现在,有趣的是:正则表达式。第一部分是^.$
,这是输入为1时的一个小例子。这并不重要,请随时忽略它。
重要的部分是^(..+)\1+$
:
-
^
-字符串开头 -
(
-组开始-
..+
-匹配2个或更多字符
-
-
)
-组结束 -
\1+
-重复先前匹配1次或多次的组 -
$
-字符串结尾
用通俗易懂的语言,最初的捕获组将匹配2个或更多字符,然后该捕获组将重复2个或更多次,并且完全匹配将覆盖字符串的整个长度。
例如,可以通过在第一个捕获组中匹配,
并再次对该组进行反向引用(再次匹配)来匹配合成数字4。
可以通过在第一个捕获组中匹配,
并通过对该组再进行两次反向引用来匹配合成数字9。
素数5不能匹配,因为该字符串没有子段,因此重复该子段N次(N为2或更大)将得到5。
因此,如果字符串是复合字符串,则整个正则表达式/^.$|^(..+)\1+$/
将针对字符串执行。颠倒该测试,然后您会检查重复逗号的数量是否为素数。