关于正则表达式中的几个术语的译法

2008年5月26日星期一

正则表达式中的look(ahead|behind|around)功能是使其强大的重要原因。关于这种匹配方式存在下面几个术语:
positive lookahead
negative lookahead
positive lookbehind
negative lookbehind
positive lookaround
negative lookaround

中文往往会把它们按字面意思翻译,positive和negative翻译成正向/负向,从而有了“正向预查”,“负向预查”的译法,但这显然没有表明出术语的真实含义---positive和negative表示的是检查是否存在这个pattern,positive表示存在,negative表示不存在。或者说检查pattern后的结论,"是"或者"否"。而ahead和behind才是向前/向后,或者正向/反向。关于ahead和behind,也可以从逻辑上来理解:lookahead是预查(文字尚未出现),lookbehind是复查(文字已经出现)。或者延用原来的一种译法,negative 译为“排除”,那么我想positive就可以译为“确认”,negative lookbehind译为“反向排除”,positive lookahead译为“正向确认”,等等

结合起来我认为这样翻译比较像术语:

positive lookahead -- 预查确认
negative lookahead -- 预查排除
positive lookbehind - 复查确认
negative lookbehind - 复查排除
positive lookaround - 双向确认
negative lookaround - 双向排除

这样比英文还要明了一点。

今天的勤快是为了明天的懒——SciTE编辑器心得

2008年5月11日星期日

接触到SciTE编辑器跟我的学习有关,当初写LaTeX用的是WinEdt。不可否认WinEdt在编写LaTeX方面的优势:WinEdt的设计相当复杂,有好多功能或许我一辈子都用不到,但这并不是我放弃WinEdt的主要原因,事实上,WinEdt对UTF-8的支持才让我最终割爱。这都是因为我要在学校和家里同步LaTeX文档,由于法语系统跟中文系统保存和显示方面的问题,只有Unicode才是我的不二选择。WinEdt虽然支持UTF-8编码,但复杂一点的字符在打开时就会丢失,这是完全不能忍受的。换编辑器其实对用惯了WinEdt的我来说是一个重大决定,但事实证明我碰巧选择到的SciTE一点也不让我后悔,反而让我有点沾沾自喜。

由于初衷是为了LaTeX文档,所以自然会在CTeX中文论坛上问问其他人用什么编辑器,这时看到instanton和mathmhb的SciTE定制版,下载了下来。当时学校的任务不重,于是仔细看了看这个文本编辑器。SciTE跟我喜欢的LaTeX,Firefox一样,都属于默认功能并不强大,越研究越可以自己添砖加瓦,产生梦寐以求的效果。开始的时候没有多研究,只是在定制版的基础上自己修改了PDFLaTeX的快捷键,并加入了XeTeX的编译选项。但这两个小小的操作让我感觉到,SciTE有相当强的可定制性。

SciTE的另一个特点就是设置文件的可读性,SciTE的诸多设置都保存在纯文本格式的.properties文件中,并且设置使用的语法也比较表面化,一看就能看懂。这让使用Total Commander的我十分满意,因为Total Commander的查找文本功能可以让我轻松地定位到想要修改的地方。在弄明白设置文件的优先级后,很多功能都可以自己修改了。一直到这时,我所做的也只是用SciTE来编译LaTeX文档,但仅此一点就让它成为我学校机器上几乎天天启动的程序。

不久,依然是学习的缘故我开始要编辑和调试C语言程序。最初我希望使用的是Visual Studio 2008,但装上去后发现过于庞大一时不好上手,所以退回来用学校机器上预装的Dev C++。这时我发现Dev C++的编辑器实在是让人难以习惯,首先我最需要的注释/取消注释的快捷键就不能正常工作,而我想到了SciTE中方便的Ctrl+Q的来回切换注释/取消注释。于是我考虑改用SciTE来编辑源代码,并且根据cpp.properties文件设置好了集成开发环境的一些参数,这个过程又复习了一下Makefile文件,Linux底下原来用在Emacs中的Makefile现在一样能用。为C调好了SciTE,才发现SciTE的功能真不赖:缩进指示、语法高亮、自动完成、函数提示一应俱全。写LaTeX文档不容易养成排版的好习惯,因为LaTeX帮你把输出排得好看一般就够了,LaTeX也不能算真正的编程(写LaTeX宏包除外),但写C程序,不排版好代码,自己写的代码都会忘掉。这时还发现了SciTE在细部修改上面的一些贴心功能:行剪切、行交换和行复制。

后来为了处理公司发过来的文本数据开始学习VBScript,用的也是SciTE,但由于VBScript并不复杂,所以默认的功能也大致够用,唯独有一点不能像EmEditor一样为保留字和默认程序(如MsgBox)定义不同的高亮颜色,仔细看了看才知道原来这要在编译SciTE程序之前就声明,所以没去多研究。

到这时对SciTE的了解依然是冰山一角,下面出现了另一个开发环境:Scilab,让我得以有机会再深入地了解一些SciTE。按理说Scilab不能集成到SciTE中,我应该是没法在SciTE中编辑Scilab的源代码后直接调试的,但Scilab自带的编辑器比Dev C++更难用。最后权衡的结果是我情愿用SciTE编辑好了再到Scilab中去调试,因为用Scilab编辑器排版代码要多花一倍的时间和心情。

这时我才开始真正了解语法高亮的原理,如果说语法高亮的颜色是用户指定的,那么如何去高亮代码的某一部则是由lexer来指定的,而这个lexer,就是展示编辑器设计者对一门程序语言的理解的地方。SciTE中默认没有Scilab的lexer,我试着调用MATLAB的,但由于注释字符的不同而失败。这时instanton告诉我只要照着MATLAB的lexer改一改就行,那么我想不得不去看看SciTE的源代码了。开源的东东上手很难,但没有什么神奇的,一切实现过程都通过源代码展示出来,诚然Documentation是少了点,但只要肯花时间,是能看懂的。下面的过程就是用SciTE自己来编辑SciTE的源代码,经过instanton关于双斜杠的提点,我写出了Scilab的lexer并编译出了属于自己的SciTE程序。不久,又被告知还是要去用MATLAB,这下好,几种编程语言一块用,则更需要用一个统一的编辑器了。MATLAB的编辑器功能上并不弱,可偏偏居然不支持ClearType字体,不能用consolas还有什么用,继续用SciTE编MATLAB吧。由于要长期面对代码,自然把白色的背景换成了暗一点的苹果绿。

当我真正要开始编程的时候,另一个问题出现在我面前:光标移动和细部修改。我是一个很懒的人,我认为要讲求效率的话,打字的时候双手是不应该离开主键盘区的。虽然我可以准确地用右手打中次键盘区里面的Home/End/PgUP/PgDN和四个光标键,但有时为了移动出一个括号去这样实在是不值得。我不习惯Vim的一键移动功能,开始怀念起Emacs,当时在Emacs底下编程的时候,光标的移动是很方便的(虽然有个笑话说Vim的用户笑Emacs的用户需要CTRL和ALT的两个脚踏板)。我也想在SciTE中实现这些功能,这时才认真去研究SciTE内建的Lua脚本,仔细看了看高人们原来就写好的脚本,“搬运”了好多Emacs类型的快捷键,打造出一套自己的配置来,如上下左右,行选定,行搬运,移动/选定到行首行尾,按单词进退/选定和删除单词,连Delete键我都搬运到了Alt+D上,这样基本上用不着次键盘区了(只是目前还在适应中,不时还用Shift+上下来选定)。继续发现SciTE默认的功能如Ctrl+F3(查找选定单词),插入书签的功能方便在文档中跳来跳去,增量搜索也是必不可少的,相信在以后,Ctrl+E(检查匹配括号)也会成为维护括号类编程语言(C语言)的利器。快捷键一多起来还真有点记不住,我干脆打印出来帖在墙上……

另外一个功能是挺晚才发现的(相见恨晚!)——缩写功能。SciTE的缩写功能我已经专门单开了一篇文章来讲述,总之,这个功能能延长人的有效生命……

感觉最近花了相当多的时间在打造SciTE上,很熟悉的感觉,就像自己在一点点地为Firefox学习JS正则表达式,一点点地为XeTeX学习字体调用一样,对它了解得越多,它就越听话。我想下面要继续学习的是SciTE的Lua脚本语言,因为懒,我已经学了批处理和VBScript了,看来我还想更懒吧……就如同文章标题说的,今天花两个小时学一个命令,将来会为我省下几天的时间。

目前发现SciTE还存的不足就是没有分割屏幕的功能,而这个功能在源代码中就没有,有时在对比维护程序的时候是相当麻烦的。