regcmp 或 regex 子例程

用途

编译并匹配正则表达式模式。

标准 C 语言库 (libc.a)

程序员工作台库libPW.a)

语法

#include <libgen.h>

char *regcmp ( String [, String, . . . ], (char *) 0)
const char *String, . . . ;

const char *regex ( Pattern,  Subject [,  ret, . . . ])
char *Pattern, *Subject, *ret, . . . ;
extern char *__loc1;

描述

注:提供 "regcmp和 "regex子程序只是为了与现有应用程序兼容。 对于可移植应用程序,请使用 "regcomp和 "regexec子程序。

regcmp子程序编译正则表达式(或 模式),并返回指向编译后形式的指针。 regcmp子程序允许多个字符串参数。 如果给出多个 "字符串参数,则 regcmp子程序会将它们视为连接在一起的参数。 如果迂到不正确的参数,那么它将返回空指针。

您可以使用regcmp命令将正则表达式编译到 C 程序中,这样就无需在运行时调用regcmp子程序。

regex子程序将已编译的模式主题字符串进行比较。 使用其他参数来接收值。 成功完成后,regex子程序会返回指向下一个未匹配字符的指针。 如果regex子程序失败,则返回一个空指针。 全局字符指针__loc1 指向匹配开始的位置。

regcmpregex子程序借自ed命令,但语法和语义略有不同。 您可以在使用regcmp regex子例程时使用以下符号:

描述
[ ] * . ^ 这些符号的含义与ed命令中的相同。
- regex子程序一起使用时,括号内的减号(或连字符)根据当前的拼写顺序表示 "通过"。 例如,[a-z] 可以等同于 [abcd . .xyz] 或aBbCc. . xYyZz]. 如果-是最后一个字符或第一个字符,那么可以使用-本身。 例如,字符类表达式 [ ] -] 匹配 ](右括号)和 -(减号)字符。(右括号)和 - (减号)字符。

regcmp子程序不使用当前的校对序列,括号中的减号只控制直接的 ASCII 序列。 例如,[a-z] 总是指 [abc . .xyz]和[A-Z]总是指[ABC . . . XYZ] . 如果需要使用regcmp子程序控制范围内的特定字符,必须明确列出这些字符,而不是在字符类表达式中使用减号。

$ 与字符串的结尾匹配。 使用该 \n 字符来匹配换行符。
+ 后跟 + (加号) 的正则表达式表示一个或多个时间。 例如: [0-9] + 等价于 [0-9] [0-9] *。
{ m}{m,}{m,u} {}(大括号)中的整数值表示应用前面正则表达式的次数。 m字符是最小数字,u字符是最大数字。 u字符必须小于 256。 如果只指定m,则表示应用正则表达式的确切次数。{m,} 等同于{m,u},匹配表达式的m次或更多次出现。 +(加号)和 *(星号)操作分别相当于 "{1,}和 "{0,}"。
( . . .)$n 这将在(n+1) ret参数中存储与所附正则表达式匹配的值。 允许 10 个带括号的正则表达式。 regex子程序无条件地进行赋值。
( . . . ) 括号组子表达式。 操作符(如 *、+ 或 [ ])适用于单个字符或括号内的正则表达式。 例如,(a*(cb+)*)$0。

前面定义的所有符号都是特殊的。 如果要匹配特殊符号本身,必须在其前面加上 (反斜杠)。 例如, \ $与美元符号匹配。

注意: regcmp子程序使用malloc子程序为向量腾出空间。 请始终释放不需要的向量。 如果不释放不需要的向量,如果反复调用regcmp子例程,就会导致内存不足。 用下面的代码代替malloc子程序,重复使用同一个向量,从而节省时间和空间:
/*  . . . Your Program . . .  */
malloc(n)
   int n;
{ 
   static int rebuf[256] ;
  
 return ((n <= sizeof(rebuf)) ? rebuf : NULL);
} 

regcmp子程序产生的代码值可被regex子程序解释为正则表达式。 例如,[a-z] 表示范围表达式,regcmp子程序会将其编译成包含两个端点(a 和 z)的字符串。

regex子程序根据当前校对序列解释范围语句。 表达式 [a-z] 可以等同于 [abcd .xyz]或aBbCcDd. . .xXyYzZ],只要减号前面的字符的拼写值低于减号后面的字符。

范围表达式的行为取决于校对序列。 如果您想要匹配一组 具体 字符,那么应该列出每个字符。 例如,要选择字母 a、b 或 c,请使用 [abc] 而不是 [a-c] 。

注意:
  1. 编译时不会对范围中包含的实际字符进行假设。
  2. 请勿使用多字节字符。
  3. 您可以在一对括号内使用](右括号)本身,如果它紧跟在前导 [ (左括号)或 [^(左括号后紧跟一个圆括号)之后,则可以在一对括号内使用。
  4. 如果是表达式中的第一个或最后一个字符,那么还可以使用减号 (或连字符)。 例如,表达式 [ ]-0]匹配右括号 ( ] ) 或字符 - 到 0。

参数

描述
主体 指定比较字符串。
String 指定要编译的 模式
模式 指定要比较的表达式。
指向要用于存储比较数据的地址。 regex子程序允许多个ret 字符串参数。