Chapter 5. 编程杂技

Table of Contents
5.1. 我怎样使用通配字符比较字符串?
5.2. 什么是在程序中发送电子邮件的最好方法?

5.1. 我怎样使用通配字符比较字符串?

对于它的回答依赖于你所谓‘通配字符’一词的确切含义。

有两种很不相同的概念被认定为‘通配字符’。它们是:

文件名通配模式(filename patterns)
     这是shell用来进行文件名匹配替换的(expansion)(或称为‘globbing’)

正则表达式
     这是供编辑器用的,比如‘grep’,等等。它是用来匹配正文,而它们正常
     情况下不应用于文件名。
    

5.1.1. 我怎样使用文件名通配模式比较字符串?

除非你不走运,你的系统应该有函数‘fnmatch()’供你进行文件名匹配。它一 般只允许Bourne Shell风格的模式。它识别‘*’,‘[...]’和‘?’,但可能不 支持在Korn和Bourne-Again shell程序下才有的更神秘(arcane)的模式。

如果你没有这个函数,那么比闭门造车更好的方法是你可以从BSD或GNU原程 序那里去抄(snarfing)一个过来。

而且,在普通的匹配实际文件名情况下,查阅‘glob()’函数,它将搜索到匹配 一个给定模式的所有存在文件。

5.1.2. 我怎样使用正则表达式比较字符串?

有很多稍有句法不同的正则表达式;大部分系统起码使用两种:一种是‘ed’ 程序可以识别的,有时候被记作‘基本正则表达式’,另一种是‘egrep’程序 可以识别的,记作‘扩充正则表达式’。Perl(译者注:Perl: Practical Extract and Report Language,实用析取与报表语言)语言拥有它自己稍有不同的风格,Emacs 也是。

为了支持这么多格式,相应的有很多实现。系统一般有正则表达式匹配函数(通 常为‘regcomp()’函数和‘regexec()’函数)提供,但是要小心使用;有些系统 有超过一种实现可用,附之以不同的接口。另外,还有很多可用的软件库的实 现(顺便说一下,一般都是将一个正则表达式编译成内部形式然后再使用,因为 总是假设你有很多字符串要比较同一正则表达式。)

一个可用的软件库是‘rx’软件库,从GNU的镜像站点可以得到。它看来是正在 开发中,基于你不同的观点这是一件又好又不好的事情 :-)