Posts Tagged regex

    低调推出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"

    (注:如果你不明白以上命令,请不要尝试运行。)