低调推出goo.gl短网址服务
| Address: | ||
快被这几个正则给搞死了! 是用来匹配C语言中的/*…*/这样的注释,为了便于表示,将*替换为x,有以下三种方法:
/x([^x]|x+[^/])*x/
/x([^x]|x+[^/x])*x+/
/x[^x]*x+([^/x][^x]*x+)*/
第一个肯定是不对的,能够匹配过多的内容,比如 /xx A xx/ foo() /xx B xx/ .原因是,如果遇到…x/…, /迫使[^/]匹配了x,而下一轮迭代中的[^x]则正好可以匹配/,从而导致越过边界。 所以上边第二个正则中,使用[^/x]来迫使x+返还/前的所有x,这样可以达到匹配/x…x/的要求。
最后一个正则使用opening normal * (special normal *)* closing的形式,这样具有更高的匹配效率,首先匹配非x字符,然后是x,之后判断x之后是否为/,如果是,则结束匹配,否则进入下一轮special normal* 的循环。直到找到x后的/结束,完成匹配。
其实在第三个正则表达式中,最迷惑我的是special部分为什么用[^/x]而不是[^/],后来想了好久,发现[^/]和[^/x]的区别只发生在正则无法匹配字符串时,如果无法匹配,必然会迫使normal部分,即[^x]*x+,返还x,而返还的x正好可以被spcial部分的[^/]匹配,从而在无法匹配时造成无休止的循环。 使用[^/x]则避免了这个问题,可以立即报告匹配结束。
在实际应用中,需将x替换为*,以第三个为例,最终的正则表达式应该是
/\*[^*]*\*+(?:[^/*][^*]*\*+)*\*/
需要说明的是,如果你的正则引擎支持忽略优先量词,这样写是很傻逼的,直接用
/\*.*?\*/
就搞定了。
前天帮同学下载一部电视剧,但找到的bt种子速度太慢,只好放弃,于是决定下载56网的视频,只所以选择56网,是因为它的视频没有被分割,而且我可以牛刀小试一下正则表达式,利用它来批量解析下载地址。之后使用迅雷下载,甚爽。
下面这个是使用perl写的(文件名parse),适用于批量解析。可将所有需要下载视频的flash地址(例:http://www.56.com/n_v48_/c23_/8_/19_/hellowjjb_/
zhajm_120817547185x_/2725000_/0_/32802621.swf)写入一个文件(1.txt),然后运行perl -w parse 1.txt > 2.txt 即可瞬间得到下载地址。
while ($line=<>)
{
if($line=~m/^http:\/\/www.56.com[^c]*?c(\d\d?)_\/(\d\d?)_\/(\d\d?)_\/([^\/]+?)_\/([^\/]*?)_\/.*swf\b/)
{
print “http://c$1.56.com/flvdownload/$2/$3/$4\@56.com_56flv_$5.flv\n”;
}
}
这个是php版的代码:
<html>
<head>
<title>56网视频解析</title>
</head>
<body>
<h3 style=”text-align:center”>视频解析</h3>
<br />
<form method=”post” action=”#”>
<center><input type=”text” size=”60″ name=”url” />
<input type=”submit” name=”submit” value=”Submit” /></center><br />
</form><?php
if(isset($_POST['url'])&&isset($_POST['submit']))
{
$url=$_POST['url'];
$pattern=’/^http:\/\/www.56.com[^c]*?c(\d\d?)_\/(\d\d?)_\/(\d\d?)_\/([^\/]+?)_\/([^\/]*?)_\/.*swf\b/’;
if(preg_match($pattern,$url,$matches))
{
$download=”http://c$matches[1].56.com/flvdownload/$matches[2]/$matches[3]/$matches[4]@56.com_56flv_$matches[5].flv”;
}
else
{
$download=”sorry,can not parse download address!”;
}
echo “下载地址是:<br />$download”;
}
?>
</body>
</html>
效果请看 这里.
for /r %i in (*.*) do @perl -pi.bak -e "s/^.*$/hello, world!/g" "%i"
(注:如果你不明白以上命令,请不要尝试运行。)