“穿越”——正则表达式
前沿:
最近在网上看到一个关于正则表达式的题目“穿越”(来自第十届信息安全与对抗技术竞赛(http://www.isclab.org/contest/homepage)),里面的正则表达式是平时很不常见的,在网上找了很多资料,最后是看到了一个关于介绍正则表达式的博客(http://deerchao.net/tutorials/regex/regex.htm),才明白是怎么做的。
题目:
分析:根据博客中的介绍,(?<word>t),是正则表达式中的后向引用中的自定义组名的用法。
后向引用:使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。后向引用用于重复搜索前面某个分组匹配的文本。
通过(?<word>t)就可以将t的组名指定为word了,要反向引用这个分组捕获的内容,就可以使用\k<word>,
第一个正则表达式:
在第一个正则中(?<a>t)就将t的组名指定为了a,(?<b>i)将i的组名指定为b,然后又通过\k<a>引用了t。
w{3}===>www
.=======>.
(?<a>t)=====>t
w======>w
(?<b>i)=====>i
\k<a>{2}=====>tt
er.com=====>er.com
所以,合起来就是www.twiter.com,也就是推特的官网。
莫斯电码
第二行提示是莫斯电码,通过一个莫斯编码和解码工具(http://www.mathsking.net/morse.htm),得到第二行的意思是HEURUSE。这貌似是一个人名,我们在推特上搜索到该人:
关注以后,发现这个人的签名居然又是一个正则表达式(=.=我有点佩服出题人的智商了。。)
正则表达式:H(?<a>e)(?<b>i)l\k<b>gab\k<a>nd[1][9]{2}[2]
第二个正则表达式:
这个正则貌似比第一个要复杂些,不过仔细分析下,其实用到的东西基本都是一样的。
H======>H
(?<a>e)=======>e
(?<b>i)=========>i
l========>l
\k<b>======>i
gab======>gab
\k<a>====>e
nd======>nd
[1]====>1
[9]{2}=====>99
[2]======>2
合起来就是Heiligabend1992,题目要求的结果是一个时间。但是我却得到了一个字符串和数字,于是乎谷歌了以下,惊奇的发现Heiligabend在德语中是平安夜的意思(掌握一门外语是多么的重要=.=),也就是1992年平安夜,即1992/12/24。验证后,结果正确!