正则表达式与数学(方程式、线性方程)

 更新时间:2011年04月12日 23:39:36   作者:  
大清早的打QQ去,收到一位网友的信息。问得是正则表达式判断素数的。去年看到过,没记录下来。
正则表达式如下:
复制代码 代码如下:

^1?$|^(11+?)\1+$ 可以判断素数(换成n个1的形式,n为数字的大小。比如5转换为11111;3转换为111;2转换为11。)

什么是素数?
初中学的吧。我们老师当初教我们的是“质数”。看下概念:
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。
换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。
这个正则表达式是什么意思?
【^1?$|^(11+?)\1+$】中间用【|】分开。【|】在正则语法里,表示“或”,作用于其前后两个单元。(还是不明白的看下面,明白的跳过下面这段)
复制代码 代码如下:

比如【ab|cd】可以匹配“ab”、也可以匹配“cd”,意思是除了“ab”就是“bc”,如果想匹配“abd”、“acd”那【|】的作用域得改下,加个范围
改成【a(b|c)】(匹配结果分配组)或者【a(?:b|c)d】(匹配结果不分配组,更高效率)。

继续刚刚的正则,分为两个分支,其一为【^1?$】和【^(11+?)\1+$】。其中【^】脱字符在正则语法中,除了在中括号【[]】中都是代表开头的意思,在中括号中的表示非。
第一个分支【^1?$】匹配的是“1”或者“”(空字符串)。
第二个分支【^(11+?)\1+$】,先看下括号内的【(11+?)】匹配的是字符“1”后面接着【1+】就是1到无数个1。后面的【?】问号表示非贪婪,就是尽量少的匹配。
接着往后看【\1+】中,【\1】表示引用已匹配的第一个组的结果。也就是第一个【()】括号匹配的结果。同理【\2】就是第二个括号捕获的结果。(小提示:上面提到的【(?:)写法就是不分配组,这样引用的话,就引用不到了】)
【+】就是1到无数个了。这个表达式我们可以这么看。【(11+?)】看成数学中的1+n,其中n为大于0的正整数。外面的【\1+】也就是引用前面这个组的次数。理解成m倍,其中m为大于0的正整数。
那整个表达式就是(1+n)*m。因为n、m都大于0,那么1+n肯定大于1,最小为2,最大为无穷大;m最小为1,最大为无穷大。
那么,一个大于2的正整数的任何大于零的倍数永远都是合数,也就是非素数。
再回过头来看看这个表达式。匹配的分别为0个或1个字符串“1”,也就是数字0,数字1。和其他所有合数。整个表达式,如果成功匹配就是非素数,如果不匹配就是质数。这就是对的了。
复制代码 代码如下:

if (preg_match('/^1?$|^(11+?)\1+$/i', $subject)) {
#不是素数
} else {
# 是素数
}

小提示:此鉴定是否为素数方法仅研究学习用,不能用到正式程序中,字符串过长,会造成非常恐惧大的回溯。
英文博客地址:http://blog.stevenlevithan.com/archives/algebra-with-regexes
在上面的博文中,有提到两个方程式与正则表达式,我们一起来研究下。
•二元方程17x + 12y = 51,其表达式【^(.*)\1{16}(.*)\2{11}$】。很好理解。【(.*)】也就是0到无数个【.】点号。(这里是接着上文说的,其实,【.】点号想表示的是字符“1”)
也就是0到无数个1,后面【\1】引用一次。后面【{16}】就是16次。作用于前面的【\1】,也就是16次引用。加上开始的【(.*)】一共正好17次。后面一个就不说了,跟这个一样。
正则引擎会依次尝试【(.*)】中0到无数个字符“1”,0个字符“1”,1个字符“1”,2个字符“1”一直增加的尝试。直到成功,否则要尝试完所有字符“1”的最大个数(这里是51个字符“1”)。
•二、三元方程式11x + 2y + 5z = 115,其表达式为【^(.*)\1{10}(.*)\2{1}(.*)\3{4}$】,理解就跟上面那个一样。注意【\2】、【\3】值得是第2,第3个括号捕获的内容,别看花眼了。
——————-分割线——————
上面几个有意思的数学题都是将整数转换为对应个数的字符“1”。下面这个,是转换为二进制数的。
先吃饭,以后再写。
您可能感兴趣的文章:

相关文章

  • javascript中10个正则表达式使用介绍基础篇

    javascript中10个正则表达式使用介绍基础篇

    本文通过举例简单的介绍了正则表达式的一些使用方法,能够助力你快速入门正则表达式,希望这篇正则总结方法能对你有用
    2020-02-02
  • .NET正则基础之.NET正则类及方法应用

    .NET正则基础之.NET正则类及方法应用

    初学正则时,对于Regex类不熟悉,遇到问题不知道该用哪种方法解决,本文结合一些正则应用的典型应用场景,介绍一下Regex类的基本应用。这里重点进行.NET类的介绍,对于正则的运用,不做深入探讨
    2023-05-05
  • 正则表达式匹配ip地址超详细讲解

    正则表达式匹配ip地址超详细讲解

    在很多场景下我们经常需要在服务器上用正则表达式来匹配IP地址,下面这篇文章主要给大家介绍了关于正则表达式匹配ip地址超详细讲解的相关资料,需要的朋友可以参考下
    2022-12-12
  • php匹配网址的正则 几乎可以匹配任何网址

    php匹配网址的正则 几乎可以匹配任何网址

    php匹配网址的正则 几乎可以匹配任何网址,需要的朋友可以参考下
    2013-05-05
  • 详解正则表达式 \v 元字符

    详解正则表达式 \v 元字符

    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。\v元字符可以匹配垂直制表符。下面给大家介绍正则表达式 \v 元字符,感兴趣的朋友一起看看吧
    2018-01-01
  • 常用正则表达式匹配代码介绍

    常用正则表达式匹配代码介绍

    这篇文章主要介绍了常用正则表达式匹配代码介绍方法的相关资料,需要的朋友可以参考下
    2016-07-07
  • PHP 正则表达式 推荐

    PHP 正则表达式 推荐

    正则表达式,大家在开发中应该是经常用到,现在很多开发语言都有正则表达式的应用,比如javascript,java,.net,php等等,我今天就把我对正则表达式的理解跟大家唠唠,不当之处,请多多指教
    2012-03-03
  • 正则基础之 环视 Lookaround

    正则基础之 环视 Lookaround

    环视只进行子表达式的匹配,不占有字符,匹配到的内容不保存到最终的匹配结果,是零宽度的。环视匹配的最终结果就是一个位置。
    2009-07-07
  • windows与linux 路径正则写法

    windows与linux 路径正则写法

    windows与linux 路径正则写法,一般可以用来区分路径。
    2009-11-11
  • JS正则表达式匹配检测各种数值类型(数字验证)

    JS正则表达式匹配检测各种数值类型(数字验证)

    这篇文章主要介绍了JS正则表达式匹配检测各种数值类型(数字验证)的相关资料,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2016-08-08

最新评论