gpt4 book ai didi

regex - 这个正则表达式是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 20:48:11 25 4
gpt4 key购买 nike

来自 this article ,
/^1?$|^(11+?)\1+$/检查一个数字(它的一元值)是否是素数。

使用这个,perl -l -e '(1 x $_) !~ /^1?$|^(11+?)\1+$/ && print while ++$_;'返回素数列表。

我对 Perl 没有足够的经验,但我明白正则表达式将是 对于一个不是素数的数。所以,如果我们打印所有不产生 的数字真有了这个表达式,我们就有了一个素数列表。这就是 perl 查询想要做的。

关于正则表达式部分,
^1?$部分用于将 1 计数为 不是素数
^(11+?)\1+$用于匹配从 4 开始的非素数。

我不明白的是为什么是?在完全需要的正则表达式中。
据我说 /^1$|^(11+)\1+$/应该没问题,实际上
perl -l -e '(1 x $_) !~ /^1$|^(11+)\1+$/ && print while ++$_;'给我一组相同的素数。

我对正则表达式的理解有什么缺陷吗?为什么是?需要吗?

不是?应该匹配它前面的表达式的零次或一次出现?

最佳答案

第一?用于将空字符串(即 0)匹配为非素数。如果您不在乎正则表达式是否与 0 匹配,则没有必要。

第二个?只是为了效率。 +通常是“贪婪的”,这意味着它匹配尽可能多的可用字符,然后如果正则表达式的其余部分无法匹配则回溯。 +?使其非贪婪,因此它仅匹配 1 个字符,然后如果正则表达式的其余部分无法匹配,则尝试匹配更多字符。 (有关贪婪与非贪婪匹配的更多信息,请参见 the Quantifiers section of perlre。)

在这个特定的正则表达式中,(11+?)表示它测试可整除性为 2 ( '11' ),然后是 3 ( '111' ),然后是 4,等等。如果你使用了 (11+) ,它将测试被 N(数字本身),然后是 N-1,然后是 N-2 等的整除性。由于除数必须不大于 N/2,没有 ?它会浪费时间测试许多不可能工作的“潜在”除数。它仍然会匹配非质数,只是速度更慢。 (此外,$1 将是最大的除数而不是最小的除数。)

关于regex - 这个正则表达式是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3329766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com