“穿越”——正则表达式

前沿:

最近在网上看到一个关于正则表达式的题目“穿越”(来自第十届信息安全与对抗技术竞赛(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。验证后,结果正确!

posted @ 2013-06-16 14:54  千手宇智波  阅读(216)  评论(0编辑  收藏  举报