Q我需要一些代码来进行正则表达式和通配符匹配。
A请确保您能区分
有许多用于匹配正则表达式的可用软件包。大多数软件包使用一对函数,一个用于“编译”正则表达式,另一个用于“执行”它(即匹配字符串)。查找名为<regex.h>或<regexp.h>的头文件,以及名为regcmp/regex, regcomp/regexec或re_comp/re_exec的函数。(这些函数可能存在于单独的 regexp 库中。)Henry Spencer 提供的一个流行、可自由再分发的 regexp 软件包可从 ftp.cs.toronto.edu 上的 pub/regexp.shar.Z 或其他几个存档中获得。GNU 项目有一个名为 rx 的软件包。[脚注]另请参见问题 18.16。
文件名通配符匹配(有时称为“globbing”)在不同系统上有多种实现方式。在 Unix 上,通配符在调用进程之前由 shell 自动扩展,因此程序很少需要显式处理它们。在 MS-DOS 编译器下,通常有一个特殊的对象文件可以链接到程序中,以便在构建argv时扩展通配符。包括 MS-DOS 和 VMS 在内的几个系统都提供用于列出或打开由通配符指定的文件的系统服务。请查阅您的编译器/库文档。另请参见问题 19.20 和 20.3。
下面是 Arjan Kenter 提供的一个简单快速的通配符匹配器
int match(char *pat, char *str) { switch(*pat) { case '\0': return !*str; case '*': return match(pat+1, str) || *str && match(pat, str+1); case '?': return *str && match(pat+1, str+1); default: return *pat == *str && match(pat+1, str+1); } }(版权所有 1995,Arjan Kenter)
通过此定义,调用match("a*b.c", "aplomb.c")将返回 1。
参考文献:Schumacher, ed., Software Solutions in C Sec. 3 pp. 35-71