现在的位置: 首页 > 综合 > 正文

regex.alf.nu 正则表达式题解

2014年01月14日 ⁄ 综合 ⁄ 共 1067字 ⁄ 字号 评论关闭

人人上看到有人分享这个,玩了两下觉得好有意思,我自己也还没玩通,边玩边写吧。

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

其他题现在还没找到满意的解法,找到了再公布~

抱歉!评论已关闭.