php 检查素数(数字)的正则表达式

一般来说,我们会使用正规表达式来做字符串匹配,今天在网上浏览的时候,看到了有人用正则表达式来检查一个数字是否为素数(质数),让我非常感兴趣,这个正则表达式如入所示:

 
检查素数与否的正则表达式

要使用这个正规则表达式,你需要把自然数转成多个1的字符串,如:2 要写成 “11”, 3 要写成 “111”, 17 要写成“11111111111111111”,这种工作使用一些脚本语言可以轻松的完成。

一开始我对这个表达式持怀疑态度,但仔细研究了一下这个表达式,发现是非常合理的,下面,让我带你来细细剖析一下是这个表达式的工作原理。

首先,我们看到这个表达式中有“|”,也就是说这个表达式可以分成两个部分:/^1?$/ 和 /^(11+?)1+$/

第一部分:/^1?$/, 这个部分相信不用我多说了,其表示匹配“空串”以及字串中只有一个“1”的字符串。
第二部分:/^(11+?)1+$/,这个部分是整个表达式的关键部分。其可以分成两个部分,(11+?)和1+$,前半部很简单了,匹配以“11”开头的并重复0或n个1的字符串,后面的部分意思是把前半部分作为一个字串去匹配还剩下的字符串1次或多次(这句话的意思是——剩余的字串的1的个数要是前面字串1个数的整数倍)。

可见这个正规则表达式是取非素数,要得到素数还得要对整个表达式求反。通过上面的分析,我们知道,第二部分是最重要的,对于第二部分,举几个例子,

示例一:判断自然数8。我们可以知道,8转成我们的格式就是“11111111”,对于(11+?),其匹配了“11”,于是还剩下“111111”,而1+$正好匹配了剩下的“111111”,因为,“11”这个模式在“111111”出现了三次,符合模式匹配,返回true。所以,匹配成功,于是这个数不是质数。

示例二:判断自然数11。转成我们需要的格式是“11111111111”(十一个1),对于(11+?),其匹配了“11”(前两个1),还剩下“111111111”(九个1),而1+$无法为“11”匹配那“九个1”,因为“11”这个模式并没有在“九个1”这个串中正好出现N次。于是,我们的正则表达式引擎会尝试下一种方法,先匹配“111”(前三个1),然后把“111”作为模式去匹配剩下的“11111111”(八个1),很明显,那“八个1”并没有匹配“三个1”多次。所以,引擎会继续向下尝试……直至尝试所有可能都无法匹配成功。所以11是素数。

通过示例二,我们可以得到这样的等价数算算法,正则表达式会匹配这若干个1中有没有出现“二个1”的整数倍,“三个1”的整数倍,“四个1”的整数倍……,而,这正好是我们需要的算素数的算法。现在大家明白了吧。

下面,我们用perl来使用这个正规则表达式不停地输出素数:(关于perl的语法我就不多说了,请注意表达式前的取反操作符)

1 perl -e'$|++;(1 x$_)!~/^1?$|^(11+?)1+$/&&print"$_ "while ++$_'

另外,让我们来举一反三,根据上述的这种方法,我们甚至可以用正则表达式来求证某方式是否有解,如:

二元方程:17x + 12y = 51   判断其是否有解的正则表达式是:^(.*)1{16}(.*)2{11}$
三元方程:11x + 2y + 5z = 115 判断其是否有解的正则表达式是:^(.*)1{10}(.*)2{1}(.*)3{4}$

时间: 2024-12-11 21:03:15

php 检查素数(数字)的正则表达式的相关文章

检查素数的正则表达式分享_正则表达式

这个正则表达式如入所示: 检查素数与否的正则表达式 要使用这个正规则表达式,你需要把自然数转成多个1的字符串,如:2 要写成 "11", 3 要写成 "111", 17 要写成"11111111111111111",这种工作使用一些脚本语言可以轻松的完成. 一开始我对这个表达式持怀疑态度,但仔细研究了一下这个表达式,发现是非常合理的,下面,让我带你来细细剖析一下是这个表达式的工作原理. 首先,我们看到这个表达式中有"|",也就

检查素数的正则表达式分享

这个正则表达式如入所示: 检查素数与否的正则表达式 要使用这个正规则表达式,你需要把自然数转成多个1的字符串,如:2 要写成 "11", 3 要写成 "111", 17 要写成"11111111111111111",这种工作使用一些脚本语言可以轻松的完成. 一开始我对这个表达式持怀疑态度,但仔细研究了一下这个表达式,发现是非常合理的,下面,让我带你来细细剖析一下是这个表达式的工作原理. 首先,我们看到这个表达式中有"|",也就

c#-在winform中求一个只能输入 英文和数字的 正则表达式 要严谨点的

问题描述 在winform中求一个只能输入 英文和数字的 正则表达式 要严谨点的 在winform中 文本框 求一个只能输入 英文和数字的 正则表达式 要严谨点的 解决方案 在Changed里判断if (!Regex.IsMatch(textBox1.Text @""^[0-9A-Za-z]*$"")){ ...} 解决方案二: [0-9A-Za-z]* 解决方案三: 在文本框中添加一个KeyUp事件,绑定一个一个文本验证,至于正则,楼上的已经说了.希望对你有帮助.

常见的数字验证正则表达式整理_正则表达式

验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数:^\+?[1-9][0-9]*$ 验证非零的负整数:^\-[1-9][0-9]*$ 验证非负整数(正整数 + 0) ^\d

自动检测数字替换非数字的正则表达式_正则表达式

直接给出代码了: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author&quo

验证数字的正则表达式

在js中用一款isnan来判断是否为数字,下面我们利用一款验证数字的正则表达式来处理如.=/^d+(.d+)?$/可以判断用户输入的是小数,整数,等都属于数字. function checkisnumeric(obj,msg) {  var reg=/^d+(.d+)?$/  if(obj.value!=''){  if(!reg.exec(obj.value))  {   alert(msg);   obj.focus();   return false;  } } 简单测试 var a=12

常见的数字验证正则表达式整理

验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数:^\+?[1-9][0-9]*$ 验证非零的负整数:^\-[1-9][0-9]*$ 验证非负整数(正整数 + 0) ^\d

中文包含数字 和 英文包含数字 的正则表达式

问题描述 //中文正则表达式var chinese = /^[u0391-uFFE5]+$/;//英文正则表达式var english = /^[A-Za-z]+$/;我验证的字符串包含数字,所以,如果除数字外都是汉字,那汉字验证通过,如果除数字外都是英文字符,那英文验证通过,也就是中间的数字不影响验证结果,数字不需要验证.请问上面的正则表达式怎么修改啊?现在这个项目上,需要比对客户机构信息,含数字,这个机构有两个名称:一个中文全称.一个中文首字母全程,都含有数字! 解决方案 //中文正则表达式

php 验证只能输入汉字、英语、数字的正则表达式

收藏了正则表达式.可以验证只能输入数字.汉字.英语.分开验证了也可以整合一起验证.但是我是拆分开好了.比较好使.可以单独的验证.经过本人测试可以使用的哦!下面就是php 验证只能输入汉字.英语.数字的代码了   <?php  if(preg_match('/^[0-9]+$/',$str)){      echo '值能输入数字';  }  if(preg_match('/^[a-zA-Z]+$/',$str)){      echo '只能输入英文';  } 验证中文 utf-8下 preg_