检查素数的正则表达式

来源:互联网 发布:斗鱼抢票软件官方网址 编辑:程序博客网 时间:2024/05/16 03:57

在酷客里面看到一篇文章《检查素数的正则表达式》,很有意思。正好最近也用了不少正则表达式的知识,于是仔细分析了一下,算是复习。




上图就是这个正则表达式,开始和末尾的“/”符号勿论。


要使用这个表达式,需要先将我们检查的数字n转换成n个1。例如2,转换成11;3转换成111;4转换成1111。转换之后的这一排1作为正则表达式匹配的对象。


我们以5为例说明这个表达式。意即我们要检查该正则表达式是否匹配字符串“11111”。


首先以“|”符号将表达式划分成2个部分。平时在看正则表达式还是shell script的时候,总是习惯性的先去找"||","&&"这样的逻辑符号,然后以之划分语句。

1)"|"符号之前是第一部分。基本的符号意义就不赘述了,这一部分的意思是,在行首和行尾之间匹配空串或1。【很明显我们的字符串不匹配这个规则】

2)"|"符号之后是第二部分。()小括号是子表达式,(11+?)的意思是匹配“11”或“111”或“1111”...以“1”开头,后面接1个到无穷多个“1”这样的字符串。\1是后向引用,在这里的意思是获取前面括号中的匹配到的内容。由于有+?符号,括号内进行懒惰匹配,即优先匹配到11,此时\1所代表的字符串即为11。【我们的字符串此刻匹配了前面2个“1”,还剩下3个“1”】

  后面的+代表在除去括号中的字符串以外,剩下的字符串匹配1到无数次括号中匹配到的字符串。

  于是前后意思就是,拿剩下的字符串匹配整数个“11”,匹配失败再匹配整数个"111",匹配失败再匹配整数个“1111”......这的作用就相当于当我们检查的那个数除以2,3,4...直至出现能除尽的情况。【我们的字符串会在剩下的3个“1”中匹配“11”,最后只剩下1个“1”,无法匹配;(11+?)再取“111”,依此类推】


  最后,所检查的数如果被匹配了,则该数不是素数。我们再取非即可。例子见上面文章中的例子。