牛B的正则表达式:素数判定与线性方程求解
icon2 Program Impossible | icon4 2008-03-23 2:04| icon316 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com

    今天又学到一个牛B东西。你相信吗?正则表达式竟然可以用来判定素数,甚至可以用来解方程!下面这段正则表达式可以用来判断,一个字符串的长度是否为合数(假设这个字符串里全是字符'1'):
^1?$|^(11+?)\1+$
    不信的话,把下面这段代码复制到你浏览器的地址栏里运行一下,True表示这个数为合数,False表示这个数为素数:

javascript:var st="1";for(var i=2;i<100;i++)document.write(i," ",/^1?$|^(11+?)\1+$/.test(st=st+"1"),"<br/>");document.close();

    其实,它的原理很简单。加号表示匹配一次或多次(加上一个问号表示非贪婪模式),\1表示引用括号里的内容,头尾的^和$则避免了部分匹配的情况。这样,^(11+?)相当于枚举除数大小,而\1+$则用于检验整个字符串是否能按此大小恰好分完。如果除得尽,则匹配成功,字符串长度为合数。另外,前面的^1?$只是为了处理n=0或n=1时的特殊情况,而符号|则表示“或者”的意思。

    采用同样的方法,我们还可以想出正则表达式其它一些类似的用途。比如,我们可以用这个正则表达式检查方程11x + 2y + 5z = 115是否有自然数解:
^(.*)\1{10}(.*)\2{1}(.*)\3{4}$
    正则表达式中,{x}表示和前面的内容匹配x次。只要用这个表达式去检测一个有115个字符的字符串,匹配成功则表示有自然数解。它的原理和上面的基本一样,我就不再重复了。

参考资料:http://blog.stevenlevithan.com/archives/algebra-with-regexes

16 条回复

  • 楼层: 沙发 | | Richardyi 说:

    抢个沙发先..

  • 楼层: 板凳 | | dd 说:

    记得有人证过正则表达式是图灵完备的

  • 楼层: 地毯 | | Zx.MYS 说:

    真是巨NB啊!

  • 楼层: 地板 | | hayate 说:

    cool!!

  • 楼层: 地下室 | | vilinov 说:

    正则很强大

    效率很低下

  • 楼层: 地基 | | cosechy 说:

    O(n)的

  • 楼层: 地壳 | | cosechy 说:

    iptables防火墙设置似乎也是图灵完全的

  • 楼层: 地幔 | | ew98 说:

    I'm interested in your school life.

  • 楼层: 地核 | | 深柳堂 » Blog Archive » 正则表达数与合数判定 说:

    [...] 从quhao那里,了解到这样一篇文章:牛B的正则表达式:素数判定与线性方程求解: 今天又学到一个牛B东西。你相信吗?正则表达式竟然可以用来判定素数,甚至可以用来解方程!下面这段正则表达式可以用来判断,一个字符串的长度是否为合数(假设这个字符串里全是字符’1′): ^1?$|^(11+?)1+$ [...]

  • 楼层: 10楼 | | rex 说:

    根据本文内容,我写了一篇分析文章。点击本条留言的网址即可查看。

  • 楼层: 11楼 | | test 说:

    正则表达式(非扩展)不是图灵完备的

  • 楼层: 12楼 | | Matrix67: My Blog » Blog Archive » 趣题:用正则表达式判断一个二进制数是否能被3整除 说:

    [...]     我们之前已经见过了正则表达式的一些很特殊的用法。这里我们再来看一个:用正则表达式判断数的整除性。例如,下面这个表达式可以匹配01串S当且仅当S是一个可以被3整除的二进制数。 [...]

  • 楼层: 12a楼 | | thxrd 说:

    运行1000000的死机了!

  • 楼层: 14楼 | | ShelleX is Not ShelleXtend 说:

    牛B的正则表达式:整除性判定...

    如何判定一个数能否被3整除? 比如6。
    如果你有Python,可以在交互式解释器里面输入:
    import re
    print re.match(”1((10*1)|(01*0))*10*$”, “110″)!=None
    ......

  • 楼层: 15楼 | | ShelleX is Not ShelleXtend 说:

    牛B的正则表达式:整除性判定...

    如何判定一个数能否被3整除? 比如6。
    如果你有Python,可以在交互式解释器里面输入:
    import re
    print re.match(”1((10*1)|(01*0))*10*$”, “110″)!=None
    ......

  • 楼层: 16楼 | | HJin_me 说:

    如此牛逼啊~~~~
    佩服~匹配规则看起来还是有些头疼~

  • 楼层: 17楼 | | congyang 说:

    nice work!

    it seems re can do something more...

您也随便说几句吧:

您可以在 Gravatar 设置您的头像。