从一道趣味题目学习正则表达式

   前天做了陈皓的趣味竞赛题目(fun.coolshell.cn),一直卡在第四道题目回文猫处不知所以然,看了微博上的提示,知道需要用正则表达式,但是不确定使用表达式的模式和原文,下面是第四道题的截图和链接,不看解析,你可以想到通关的办法吗?

  从一道趣味题目学习正则表达式_第1张图片

    看了答案,才知道source藏在网页的html源码中,曾经有过去看源码的念头,想作者不会这么geek吧,结果。。。就在源码中,下面是需要搜寻的网页的源码:


      而匹配的模式很简单,即前两个是大写字母或数字,后两个是前两个的反序,中间是小写字母,cat即为小写提示,同时也是答案的提示,陈皓给出的答案是:

 grep -o "\([A-Z]\)\([0-9]\)[a-z]\2\1\|\([0-9]\)\([A-Z]\)[a-z]\4\3" cat.txt | sed -E "s/(.)(.)(.)\2\1/\3/g" | awk '{printf("%s",$1)}' && echo ""


这个正则表达式可以这样理解:

在cat.txt文本中,以-o指定的模式进行搜索,模式为大写字母,数字,小写字母,然后是同样的数字,大写字母;或者数字,大写字母,小写字母,然后是同样的大写字母,数字。这里面用到了正则表达式的分组和后向引用的技巧:

上面的每个小括号中的内容(用\(或\)来取消()的字符转义)为一个分组,如下,小写字母后紧跟着第二个分组[0-9],第一个分组[A-Z].\2表示对对应分组的反向引用,如下:

"\([A-Z]\)\([0-9]\)[a-z]\2\1\

这样,得到这样的模式后,通过sed截取其中间字符,这时也用到了分组和反向应用,其中. 号表示匹配除换行符以外的任意字符。这样就得到了中间字符,awk表示将字符写入到字符串中,这样就得到了通关字符串variables。


关于正则表达式学习,推荐一个网站:http://deerchao.net/tutorials/regex/regex.htm


 
   
 

你可能感兴趣的:(linux)