深柳堂

《精通正则表达式》英文第三版PDF提供下载

之前发过一款chm版的《精通正则表达式》英文第三版。它的特点是,体积小,打开快速。这是指windows下。在linux下,chm也有很多阅读器,不一一细述了。可以直接点这个页面寻找自己中意的linux下的chm阅读器。

今天在网上发现了一款pdf的《精通正则表达式》英文第三版,于是上载到自己的skydrive空间,与各位分享。并列在这里,请按自己的需求下载。

与chm版相比,PDF版的缺点在于体积庞大:10MB。不过,在硬盘普便大于160G的今天,10M应该是很小的空间吧?随随便便一个RMVB也上百MB了。

与chm版相比,PDF版的优点在于,原书中有很多很多的跳转符(),在PDF中加了内部链接,可以很方便地转到所指定的页面。在chm中就没有页码了,通常是一节或一章使用一个页面,如果没有内部链接的话,读起来很费神的。

两者的特点都是,对代码格式支持不好。按理说,电子文档应该有着比纸版书更好的表现力。但是一来电子书有时甚至是一种侵权的产物,这种情况我们也就不好苛求什么了。

还有一个特点是,两本电子书都是英文版。你可以把这个特点当成优点来看,呵呵。

点击蓝色部分的书名开始下载。

发布7款与搜索相关的cheat-sheet

正则表达式袖珍小抄

以前曾经发布在我的另一款blog上,由于与正则表达式相关,特在此处重新发布。该小抄的英文原始文档在这里,下面的链接是我翻译过的(中英对照)。希望能给经常使用正则表达式的朋友带来便利。

Google Cheat Sheet

这里其实有个简化版的google cheat sheet,网页版的。下面提供的,更为全面,排版也更为华丽,共有6款,列表如下:

  1. EXTREME GOOGLING.pdf
  2. Google Cheat Sheet.pdf
  3. SEO_Web_Developer_Cheat_Sheet.pdf
  4. google-url-parameters.pdf
  5. google_cheat_sheet_03.pdf
  6. googlecheatsheet_02.pdf

请点击下表中的蓝色文件名开始下载:

为project babel加上geshi语法高亮显示

注:本文使用的正则表达式为php风格。

从v2ex到M6,我一直喜欢project babel(PB)。自己也尝试在本地或服务器上架设PB系统。遇到的一个问题是:PB只支持有限的ubb代码,当我想在PB上贴源码时,没有语法高亮很不美观。

管理员对此的答复是,简约是最好的,不必非得使用72号红色字体加上一堆感叹号才能让文字有力度。当然了,这样不给脑残以任何自证的机会,当然是不错。可是因为怕脑残搞乱而消减功能,就有些类似于怕一个男人淫乱而将全天下男人葵花宝典掉一样了。

代码语法高亮,最著名的模块莫过于geshi。我使用过php写过几行代码,语法什么的都需要现查手册;对css、form之类也不是很熟悉。因此让我自己改造PB的话,一时摸不到头绪。于是在M6上发了求教贴。有热心人sara回复如下:

有个缺点,就是一个帖子里同一种代码只能用一次,希望有高手能改进一下。
比如php代码:[php]your code[/php]

  1. 在v2excore.php加geshi的路径。
  2. 在utilities.php加
    preg_match('/\[php\]/i', $text, $_m_php_open);
    preg_match('/\[\/php\]/i', $text, $_m_php_close);
    if ((count($_m_php_open) == 1) && (count($_m_php_open) == count($_m_php_close))) {
    list($a, $b) = explode('[php]', $text);
    list($c, $d) = explode('[/php]', $b);
    $c = str_replace('&lt;', '<', $c);
    $c = str_replace('&gt;', '>', $c);
    $text = $a . '<div class="codes php">' . geshi_highlight($c, 'php', '', 'true') . '</div>' . $d;
    }

    加在

    $text = preg_replace($p, $r, $text);

    的后面。

我读了这段代码之后,发现它并没有大段的CSS内容,这我就放心多了。于是细读之,遇到问题就查手册。

这段代码翻译成自然语言,就是:

  1. 查找文本中[php]的次数$_m_php_open,以及[/php]的次数$_m_php_close;查找时不分大小写。
  2. 次数$_m_php_open与$_m_php_close是否相等且等于1。如果不满足条件,就不处理了。
    只有两者相等且为1时,记录下[php]与[/php]之间的内容$c,把里面所有的”<”、”>”都换成”<"、">“形式。
  3. 把需要处理的代码部分$c使用geshi_highlight的相关语法(这里是PHP)进行格式化。

既如此,那我就可以自已实现了。

刚才使用

preg_match('/\[php\]/i', $text, $_m_php_open);
preg_match('/\[\/php\]/i', $text, $_m_php_close);

寻找配对的标签,不是一种好的方法。因为它的通用性不强,不便于前后配对。较好的解决方法是:

$text=preg_replace_callback("#\[(asp|bash|c|cpp|csharp|css|delphi|div|dos|dot|ini|java|java5|javascript|latex|lisp|luamatlab|mysql|pascal|perl|php|python|qbasic|rails|reg|ruby|scheme|sql|tcl|text|vb|vbnet|xml)\](.*?)\[/\\1\]#ix","geshi_replace",$text);

使用正则表达式,第一组括号捕获了语言种类标签,第二组捕获了程序内容。选项i表示不分大小写,s表示点号可以匹配任意字符(包括换行符)。

之所以使用callback方式的正则匹配,是因为替换的内容多而复杂。该callback函数是这样定义的:

function geshi_replace($matches)  
{
    //matches[1]=lang
    //matches[2]=code
    $code=$matches[2];
    $lang=$matches[1];
    $code = str_replace('&lt;', '<', $code);
    $code = str_replace('&gt;', '>', $code);
    $str = '<div class="code">'. geshi_highlight($code, $lang,'','true') .'</div>';
    $str = str_replace("<br />","",$str);
    return $str;
}

程序与原来给出的大同小异。只是还有一行

$str = str_replace("<br />","",$str);

是新加上去的。这是因为geshi_highlight输出的文本,总是包含”<br /><br />”,因此显示出来的高亮代码行距太大,这里给它修剪一下,就可以了。

总结一下如何在PB6.0中加入geshi:

1. 上传geshi到babel目录;
2. 在v2excore.php加geshi的路径,让pb能找到geshi.php。
3. 在Utilities.php文件下,function format_ubb之前加上如下function:

      function geshi_replace($matches)
      {
      //matches[1]=lang
      //matches[2]=code
      $code=$matches[2];
      $lang=$matches[1];
      $code = str_replace('<', '<', $code);
      $code = str_replace('>', '>', $code);
      $str = '<div class="code">'. geshi_highlight($code, $lang,'','true') .'</div>';
      $str = str_replace("<br />","",$str);
      return $str;
      }

4. 在function format_ubb中的

      $text = preg_replace($p, $r, $text);

之后插入一行代码:

      $text=preg_replace_callback("#\[(asp|bash|c|cpp-qt|cpp|csharp|css|delphi|diff|div|dos|dot|eiffel|fortran|freebasic|genero|gml|groovy|haskell|html4strict|idl|ini|inno|io|java|java5|javascript|latex|lisp|lua|m68k|matlab|mirc|mpasm|mysql|nsis|objc|ocaml-brief|ocaml|oobas|oracle8|pascal|per|perl|php-brief|php|plsql|python|qbasic|rails|reg|robots|ruby|sas|scheme|sdlbasic|smalltalk|smarty|sql|tcl|text|thinbasic|tsql|vb|vbnet|vhdl|visualfoxpro|winbatch|xml)\](.*?)\[/\\1\]#is","geshi_replace",$text);

大功告成。
使用方法:

  1. 在PB贴子的编辑框中使用[lang]…[/lang]标签。
  2. lang标签不可嵌套。
  3. lang的可选方案以geshi支持为限,大致包括:asm, asp , bash, c, cpp-qt, cpp, csharp, css, delphi, diff, div, dos, dot, eiffel, fortran, freebasic, genero, gml, groovy, haskell, html4strict, idl, ini, inno, io, java, java5, javascript, latex, lisp, lua, m68k, matlab, mirc, mpasm, mysql, nsis, objc, ocaml-brief, ocaml, oobas, oracle8, pascal, per, perl, php-brief, php, plsql, python, qbasic, rails, reg, robots, ruby, sas, scheme, sdlbasic, smalltalk, smarty, sql, tcl, text, thinbasic, tsql, vb, vbnet, vhdl, visualfoxpro, winbatch, xml。呵呵。

结论:

  1. 十分感谢sara
  2. 正则表达式一如既往地有用、好用。
  3. 有些问题看上去很难。可是只要打开缺口,剩下的就不成问题;就如慕容复语:“这几步棋我也想得出来。万事起头难,便是第一着怪棋,无论如何想不出。”

匹配中文的正则表达式

以前在编写linux下的scim郑码码表时,就跟正则式的中文匹配问题打过交道。当时总结了这样一条经验,utf8编码格式下,中文正则式应该这样书写:

[\x80-\xff]{3}

当然,这与语言无关。在perl与python中,都是一样的。

现在,这条正则式又派上用场了。正在编写的一个小程序MiniBlogs Updater中,需要计算用户所输入的文字字数。因为中英文字符编码长度不一,如果直接使用python中的len()函数,它计算的是该字串的实际长度,一个中文字并非等同于一个英文字母的。因此,需要把中文字当成英文字母来处理。

我写了这样一条语句来处理:

?View Code PYTHON
length=len(re.sub('[\x80-\xff]{3}','a',msg))

它的意思是,把所有的中文都替换成英文字母a,然后再统计字数。(只是统计而已,不修改源字串。)这条语句在windows下utf8文件中能够正常工作。

再分享两则与匹配中文的正则表达式有用的链接: