今天又学到一个牛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
抢个沙发先..
记得有人证过正则表达式是图灵完备的
真是巨NB啊!
cool!!
正则很强大
效率很低下
O(n)的
iptables防火墙设置似乎也是图灵完全的
I'm interested in your school life.
根据本文内容,我写了一篇分析文章。点击本条留言的网址即可查看。
正则表达式(非扩展)不是图灵完备的
运行1000000的死机了!
如此牛逼啊~~~~
佩服~匹配规则看起来还是有些头疼~
nice work!
it seems re can do something more…
._. 竟然能用正则表达式的寻找匹配来平均分割,看来真的需要细心。不过那个 ^(11+?)1+$ 真的意想不到。
javascript:var st=”1″;for(var i=2;i<100;i++)document.write(i,” “,/^(.{2,})1+$/.test(st=st+”1″),””);document.close();
好厉害啊,太牛了吧
太棒了,果然是牛哥
^(.*)1{10}(.*)2{1}(.*)3{4}$
我说里面的1,2,3怎么看着这么奇怪,原来应该是反向引用,不过\没了。
^1?$|^(11+?)1+$应该为 ^1?$|^(11+?)\1+$
对
^1?$|^(11+?)1+$应该为 ^1?$|^(11+?)\1+$
建议博主修正一下