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;

描述

注: 提供 regcmpregex 子例程是为了仅与现有应用程序兼容。 对于可移植应用程序,请改为使用 regcompregexec 子例程。

regcmp 子例程编译正则表达式 (或 Pattern) 并返回指向已编译格式的指针。 regcmp 子例程允许多个 String 参数。 如果给出了多个 String 参数,那么 regcmp 子例程会将它们视为连接在一起。 如果迂到不正确的参数,那么它将返回空指针。

您可以使用 regcmp 命令将正则表达式编译到 C 程序中,从而经常不需要在运行时调用 regcmp 子例程。

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

regcmpregex 子例程是从 ed 命令中借用的,但是语法和语义已稍作更改。 可以将以下符号与 regcmpregex 子例程配合使用:

表 1. 符号
描述
[ ] * . ^ 这些符号的含义与它们在 ed 命令中的含义相同。
- regex 子例程配合使用的方括号内的减号 (或连字符) 根据当前整理顺序表示 "through"。 例如, [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) th 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 子例程根据当前整理顺序来解释 range 语句。 表达式 [a-z] 可以等同于 [abcd . . . Xyz] [aBbCcDd . . . xXyYzZ],只要字符 减号具有比字符 追随 减号更低的整理值。

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

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

参数

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