人人上看到有人分享这个,玩了两下觉得好有意思,我自己也还没玩通,边玩边写吧。
- Plain Strings 观察一下就发现左边都含有foo,右边都没有,所以简单写成这样就好了
foo
- Anchors 名字就叫锚,直接观察发现以k结尾就行了
k$
- Ranges 名字就叫区间,所以发现要匹配的字符都只有a-f,所以
^[a-f]+$
- Backrefs 名字就叫反引用,所以发现是某三个字符在后面还会出现,这样
(...).*\1
- Abba 名字就提示了要逆序引用两组,其实这里开始就觉得正则表达式只适合处理那种非常普通,有规则可循的字符串,并且规则有时候看起来简单,但是用正则处理起来就非常麻烦,甚至是不能处理,比如如果这题的限制不仅仅是两个字符逆序,是不定个数的,怎么做?
^(?!.*(.)(.)\2\1)
- A man,a plane 两到三个字符逆序,中间可以夹杂其他莫名其妙的东西
^(.)(.).*\2\1$
- Prime 大招来了,之前想都没想过正则表达式还能拿来检测质数。想了半天没一点思路,然后查到一个解法瞬间被治愈了,正则表达式太漂亮了。解法是质数本身的限制,质数是非合数,合数是可以分解成两个大于1的数相乘的数,而且这道题本身就是让你找出由奇数个x组成的字符串,而不是让你找出奇数(这个的写成“x”*n也就解决了,但是超出正则的能力了吧)。然后乘法的意义是什么?a*b不就是表示b个a么?那我分组绑定一个a然后重复b次不就完了?这里要求两个数都大于1,那我a是由至少两个x组成,分组重复至少两次不就好了?
^(?!(xx+)\1+$)
- Four 相比上一题这题好无聊啊,一个字符间隔出现四次,中间间杂有且仅有一个其他字符
(.).\1.\1.\1
- Order 从这题开始,觉得出题者的意图就是想读者展示正则表达式的无力,提示就一个Cheat.那我就正大光明的作弊了,一想到英语里面出现最多的字符是e,既然是要保持顺序,那就由e分开吧
^[a-e]*[f-z]*$
- Triples 这题知道解法,但是写起来太麻烦了,画一个状态图就知道要这么做了。还在优化中,暂且不给解法。
- Power 这题也是挺无奈的,本来的想法是2的阶乘就是每次翻倍吧,然后反引用一次括起来再反引用就翻倍了,但是这样要写10个括号,好蛋疼,后来发现分部来就好了,像这样的话只需要三次翻倍,x是0次方,可以覆盖0123,x{8}是3次方,可以覆盖3456,然后x{128}是7次方,可以覆盖789和10,所以就覆盖完了
^(((x|x{8}|x{128})\3?)\2?)\1?$