[英]How does this regular expression work?
从这篇文章来看,
/^1?$|^(11+?)\\1+$/
检查一个数字(它在一元中的值)是否为素数。
使用这个, perl -l -e '(1 x $_) !~ /^1?$|^(11+?)\\1+$/ && print while ++$_;'
返回素数列表。
我没有足够的Perl经验,但据我所知,正则表达式对于非素数的数字都是正确的。 因此,如果我们使用此表达式打印所有不产生true的数字,我们会有一个素数列表。 这就是perl查询尝试做的事情。
关于正则表达式部分,
^1?$
part用于计算1作为非素数
^(11+?)\\1+$
用于匹配不是从4开始的素数。
我不明白的是为什么?
在正则表达式中所需要的。 根据我/^1$|^(11+)\\1+$/
应该很好,实际上
perl -l -e '(1 x $_) !~ /^1$|^(11+)\\1+$/ && print while ++$_;'
给了我相同的素数集。
我对正则表达式的理解有什么缺陷吗? 为什么?
需要吗?
不是?
应该匹配前面的表达式的零次或一次出现?
第一个?
用于将空字符串(即0)与非素数匹配。 如果你不关心正则表达式是否匹配0,那么就没有必要了。
第二个?
只是为了提高效率。 +
通常是“贪婪的”,这意味着它匹配尽可能多的字符,然后如果正则表达式的其余部分无法匹配则回溯。 +?
使它非贪婪,因此它只匹配1个字符,然后如果正则表达式的其余部分无法匹配则尝试匹配更多。 (有关贪婪与非贪婪匹配的更多信息,请参阅perlre的Quantifiers部分 。)
在这个特定的正则表达式中, (11+?)
意味着它测试可分性为2('11 '11'
),然后是3( '111'
),然后是4,等等。如果你使用(11+)
,它将测试N的可分性(数字本身),然后N-1,然后N-2等。因为除数必须不大于N / 2,没有?
它会浪费时间测试许多无法工作的“潜在”除数。 它仍然会匹配非素数,只是更慢。 (另外, $1
将是最大的除数而不是最小的除数。)
第一个?
将使“”(空字符串,一元零)不是素数。 零定义为非素数。
第二个是不同的; 它会从贪婪匹配中停止正则表达式。 它应该大大提高匹配的性能,因为该部分的第一部分( (11+)
)在不得不回溯之前不会消耗几乎整个字符串。 如果省略问号,则可以有效地测试奇数n
是否可以被n-1
整除,因此一个向下; 如果你包括它,你首先测试两个可分解性,依此类推。 显然,数字往往可以被更小的因素整除,所以你的匹配会更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.