代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

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

  •  15
  • Aakash Goel  · 技术社区  · 15 年前

    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 ++$_;'

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

    ?

    2 回复  |  直到 15 年前
        1
  •  7
  •   cjm    15 年前

    第一个 ? 用于将空字符串(即0)匹配为非素数。如果您不关心regexp是否匹配0,那么就没有必要了。

    第二个 ? 只是为了提高效率。 + 通常是“贪婪”的,这意味着它匹配尽可能多的可用字符,如果regexp的其余部分不匹配,则返回。这个 +? 使其非贪婪,因此它只匹配1个字符,然后在regexp的其余部分不匹配时尝试匹配更多字符(看到了吗 the Quantifiers section of perlre 有关贪婪匹配与非贪婪匹配的更多信息。)

    在这个特殊的regexp中 (11+?) 意味着它测试2的可除性( '11' ),然后是3( '111' ),然后是4,依此类推 (11+) 测试大量不可能工作的“潜在”因子会浪费时间。它仍然会匹配非素数,只是速度要慢一些(也, $1 是最大的除数而不是最小的。)

        2
  •  6
  •   Borealid    15 年前

    第一个 ?

    第二种是不同的;它阻止正则表达式进行贪婪匹配。这将大大提高比赛的表现,因为这一部分的第一部分( (11+) n 可被整除 n-1 就这样一个倒下了;如果你把它包括进去,你首先要测试2的可除性,依此类推。显然,数字更容易被更小的因子整除,所以你的匹配会更快。