Ste*_*e28 2 javascript regex primes
我在另一个编程社区看到了这个主要的测试代码。
isPrime=n=>!/^.$|^(..+)\1+$/.test(Array(n+1));
Run Code Online (Sandbox Code Playgroud)
我可以理解 RegExp 的事情,但我无法理解这是如何工作的。
为什么空数组在 RegExp 测试中?为什么它有效???
我搜索了它,但我找不到任何信息... :(
首先,正则表达式正在针对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+$/如果字符串是复合的,则整个正则表达式将针对字符串执行。反转该测试,您可以检查重复逗号的数量是否为素数。