[奇淫怪巧] 利用正则表达式判断素数
2014-07-10 23:51
337 查看
最近在学习正则表达式,偶然间看到利用正则表达式判断一个数是不是素数的帖子。当时就震惊了,觉得好神奇。那个判断素数的函数是这样子的:
有没有觉得很神奇?我当时就觉得相当的有想象力的一种实现。那让我们看一下这个正则表达式是如何做判断素数的。
第一步,创建了一个长度为i,并以'*'填充的字符串。
第二步,让这个后面的正则表达式去匹配这个字符串,如果匹配则不是质数。
过程很简单。让我们看一下这个正则表达式。
能被这个正则表达式匹配出则这个数不是素数,这个正则表达式可以分成两部分看,
第一部分:
第二部分:
这个表达式基本内容解释完了,那么为什么能够匹配非素数呢?
匹配的过程大致是这样子的,
如果匹配了则说明这个数必定能够被某一个数整除,如果匹配完都没匹配到则说明从2到n-1的数都不能整除n,那就证明这个数是素数!
打个比方:我们匹配12。
如果你觉得我解释的不清楚没明白,下面有其他人的解释:
CoolShell
A regular expression to check for prime numbers
public static bool IsPrime(int i) { return !Regex.IsMatch(new String('*', i), "^.?$|^(..+?)\\1+$"); }
有没有觉得很神奇?我当时就觉得相当的有想象力的一种实现。那让我们看一下这个正则表达式是如何做判断素数的。
第一步,创建了一个长度为i,并以'*'填充的字符串。
第二步,让这个后面的正则表达式去匹配这个字符串,如果匹配则不是质数。
过程很简单。让我们看一下这个正则表达式。
能被这个正则表达式匹配出则这个数不是素数,这个正则表达式可以分成两部分看,
第一部分:
^.?$。
^匹配字符串起始位置,
$匹配字符串结束位置,
.表示匹配单个任意字符,
?表示可选。合起来的意思就是匹配只有一个字符或者没有字符的字符串,也就是0或者1。0或1不是质数,这里特殊匹配这两个数字。
第二部分:
^(..+?)\1+$。这部分是关键。先拆开来解释一下意思,
^和
$就不解释了。
(..+?)表示匹配两个及以上的任意字符,这里的
+?表示它是忽略优先(lazy)的,对结果来说没有影响,出于性能考虑。注意到这个表达式有一个括号,这个是一个捕获型括号。
\1是反向引用,引用的内容就是前面第一个括号选中的内容。那么后面
\1+的意思就是匹配前面括号匹配中的内容一次或多次。
这个表达式基本内容解释完了,那么为什么能够匹配非素数呢?
匹配的过程大致是这样子的,
(..+?)首先匹配2个字符,然后
\1+匹配2的倍数个字符,如果能够匹配是不是就说明了这个数是2的倍数啦?当匹配失败的时候,匹配引擎将
(..+?)匹配三个字符,然后
\1+匹配3的倍数个字符,如果能够匹配则是3的倍数。依此类推。。。。。。
如果匹配了则说明这个数必定能够被某一个数整除,如果匹配完都没匹配到则说明从2到n-1的数都不能整除n,那就证明这个数是素数!
题外话
(..+?)中
?的作用,我认为这个是为了提高性能的。如果没有
?的话
(..+?)会试图把所有的字符都匹配完,然后发现后面还有表达式,于是从最后一个位置开始回溯。而加了
?则是从第二个就开始往后去匹配。
打个比方:我们匹配12。
^.?$|^(..+)\1+$会做的事情是先判断12是不是11的倍数、then 12是不是10的倍数........then 12是不是6的倍数。
^.?$|^(..+?)\1+$会做的是先判断12是不是2的倍数,then 就没then了。对于素数的效率是一样的,因为每个位置都需要匹配过来,但是对于非素数从小开始匹配则能够让这个表达式早点结束匹配。
如果你觉得我解释的不清楚没明白,下面有其他人的解释:
CoolShell
A regular expression to check for prime numbers
相关文章推荐
- 利用正则表达式判断一个字符串是否为数字
- asp.net中利用正则表达式判断一个字符串是否为数字的代码
- 利用正则表达式检查素数
- 利用正则表达式,来判断年/月/日的格式是否正确,含对于(含捕捉组)正则表达式的解析
- 【Java】利用正则表达式判断是否为网址
- 利用JavaScript和正则表达式进行丰富的日期判断
- 利用正则表达式 进行字符的判断
- java利用正则表达式判断是否是浮点数
- 利用正则表达式 进行字符的判断
- 如何利用js正则表达式判断ip地址的合法性
- 利用JavaScript和正则表达式进行丰富的日期判断
- 利用正则表达式判断手机号码格式是否合法
- JavaScript利用正则表达式自己写数字判断函数
- 正则表达式判断质数(素数)的代码
- 用正则表达式来判断素数的代码
- 利用JavaScript和正则表达式进行丰富的日期判断(给其它项目组的代码,有比较好的编程风格和注释)
- 利用正则表达式判断四则运算表达式是否合法
- java利用正则表达式判断输入的日期格式为yyyy/MM/dd
- 【C#】利用正则表达式判断输入是否为纯数字、容器类
- 利用正则表达式判断 手机号是否支持 中国移动 中国联通 中国电信