regexec 子例程

用途

Compares the null-terminated string that is specified by the value of the 字符串 parameter against the compiled basic or extended regular expression 怀孕, which must have previously been compiled by a call to the regcomp subroutine.

标准 C 语言库 (libc. a)

语法

#include <regex.h>

int regexec (PregStringNMatchPMatchEFlags)
const regex_t * Preg;
const char * String;
size_t  NMatch;
regmatch_t * PMatch;
int  EFlags;

描述

regexec子程序将String参数中的空尾字符串与Preg参数中已编译的基本正则表达式或扩展正则表达式进行比较,后者由之前调用的 "regcomp子程序初始化。 如果找到匹配,"regexec子程序将返回 0。 如果 "regexec子程序没有找到匹配或发现错误,则返回一个非零值。

如果NMatch参数值为 0,或者在调用 "regcomp子程序时设置了 "REG_NOSUB标志,则 "regexec子程序将忽略PMatch参数。 否则, PMatch 参数将指向至少由 匹配 参数指定的元素数组成的数组。 regexec子程序将PMatch参数指向的数组元素填入String参数子串的偏移量。 偏移量与 "regcomp子程序指定的原始模式参数的括号子表达式相对应。

pmatch.rm_so结构是子串开头的字节偏移量,"pmatch.rm_eo结构比子串结尾的字节偏移量大一个。 子表达式 从第 个匹配的左括号开始,从 1 开始计数。 该数组的 0 元素对应于整个模式。 PMatch参数中未使用的元素(直到PMatch[NMatch -1] 值)将被填充为-1。 如果NMatch参数指定的子表达式数量超过了子表达式的数量(模式参数本身也算作一个子表达式),则只记录第一个NMatch -1子表达式。

在匹配基本或扩展正则表达式时, 模式 参数的任何给定的父代子表达式都可能与 字符串 参数的多个不同子字符串匹配。 否则,即使整个模式确实匹配,它也可能不匹配任何子串。

以下规则用于确定在与正则表达式匹配时要在 PMatch 参数中报告的子串:

  • 如果正则表达式中的子表达式多次参与匹配,则在PMatch参数中报告最后一个匹配子串的偏移量。
  • 如果一个子表达式没有参与匹配,则PMatch参数中的字节偏移值为-1。 如果以下任何一项为 true ,那么子表达式不会参与匹配:
    • 在基本正则表达式中,子表达式后面会紧跟一个 "*(星号)或 "\{\}(反斜杠、左括号、反斜杠、右括号)。
    • 在扩展正则表达式中,子表达式后紧接着出现 "* (asterisk), ? (question mark),或 "{ }(左括号和右括号),且子表达式不匹配(匹配 0 次)。
    • 扩展正则表达式中使用了 "|(管道)来选择不匹配的子表达式或另一个子表达式,而另一个子表达式是匹配的。
  • 如果子表达式包含在一个子表达式中,则PMatch参数中的数据指的是最后一个子表达式。
  • 如果一个子表达式包含在一个子表达式中,且PMatch参数中的字节偏移值为-1,则PMatch参数中的指针值也为-1。
  • 如果子表达式匹配的字符串长度为零,则PMatch参数中的偏移量指的是紧随匹配字符串之后的字节。

如果在调用 "regcomp子程序时在 "cflags参数中设置了 "REG_NOSUB标志,并且在调用 "regexec子程序时 "NMatch参数不等于 0,则 "PMatch数组的内容未指定。

如果调用 "regcomp子程序时 "cflags参数中未设置 "REG_NEWLINE标志,那么 "模式或 "字符串参数中的换行符将被视为普通字符。 如果在调用 "regcomp子程序时设置了 "REG_NEWLINE标志,换行符将被视为普通字符,但以下情况除外:

  • 字符串参数中的换行符不能与括号表达式外的句点或任何形式的非匹配列表相匹配。 不匹配的列表表达式以 ^ (抑扬符) 开头,并指定与任何字符或整理元素以及前导插入标记后列表中的表达式匹配的列表。 例如,正则表达式 "[^abc]匹配除 "a、"b或 "c之外的任何字符。 只有当圆周括号是列表中紧跟左括号的第一个字符时,它才具有这种特殊含义。
  • 模式参数中的 "^(圆括号)用于指定表达式锚定时,无论 "REG_NOTBOL标志的设置如何,都会匹配紧接在字符串参数中换行符之后的零长度字符串。
  • 模式参数中的 "$(美元符号)用于指定表达式锚点时,无论 "REG_NOTEOL标志的设置如何,都会匹配紧接在字符串参数中换行符之前的零长度字符串。

参数

表 1. 参数
描述
普雷格 包含要与 字符串 参数进行比较的已编译基本或扩展正则表达式。
String 包含要匹配的数据。
匹配 包含要匹配的子表达式数。
PMatch 包含与 普雷格 参数中的对应子表达式匹配的 字符串 参数中的偏移量数组。
EFlags 包含控制 "regexec子程序行为的 0 个或多个标志的比特包容 OR。

EFlags 参数修改对 字符串 参数的内容的解释。 它是 "regex.h文件中定义的下列标志中 0 个或多个标志的比特包容 OR:

REG_NOTBOL
字符串 参数所指向的字符串的第一个字符不是行的开头。 因此,"^(圆括号)作为特殊字符使用时,与字符串参数的开头不匹配。
REG_NOTEOL
字符串 参数所指向的字符串的最后一个字符不是行的结尾。 因此,"$(美元符号)作为特殊字符使用时,与字符串参数的结尾不匹配。

返回值

成功完成后,"regexec子程序返回 0,表示字符串参数的内容与模式参数的内容相匹配,或者表示没有发生匹配。 REG_NOMATCH错误在 "regex.h文件中定义。

错误代码

如果 "regexec子程序不成功,它将返回一个非零值,说明问题的类型。 在 "regex.h文件中定义了以下宏,用于表示可能返回的错误代码:

表 2. 错误代码
描述
REG_NOMATCH 指示基本正则表达式或扩展正则表达式找不到匹配项。
REG_BADPAT 指示无效的基本正则表达式或扩展正则表达式。
REG_ECOLLATE 指示被引用的整理元素无效。
REG_ECTYPE 指示无效的字符类型引用。
REG_EESCAPE 表示模式中的尾部 "\ (反斜线)。
REG_ESUBREG 表示 "\digit中的数字无效或有误。
REG_EBRACK 表示 "[ ] (左右括号)不平衡。
REG_EPAREN 表示 \ ( \ )(反斜线、左括号、反斜线、右括号)或 ( ) (左括号和右括号)不平衡。
REG_EBRACE 表示 "\ { \ }(反斜线、左括号、反斜线、右括号)不平衡。
REG_BADBR 表示 "\ { \ }(反斜杠、左括号、反斜杠、右括号)的内容不可用(不是数字、数字太大、超过两个数字或第一个数字大于第二个数字)。
REG_ERANGE 表示范围表达式中不可用的端点。
REG_ESPACE 指示内存不足。
REG_BADRPT 表示'a ?(问号)、*(星号)或 +(加号)前面没有有效的基本正则表达式或扩展正则表达式。

如果 "regexec子程序的Preg参数值不是 "regcomp子程序返回的已编译基本正则表达式或扩展正则表达式,则结果未定义。

示例

下面的示例演示了如何将 "REG_NOTBOL标志与 "regexec子程序配合使用,以查找一行中与用户提供的模式匹配的所有子串。 (为简单起见,本例中几乎不做错误检查)

(void) regcomp (&re, pattern, 0) ;
/* this call to regexec finds the first match on the line */
error = regexec (&re, &buffer[0], 1, &pm, 0) ;
while (error = = 0) {   /* while matches found */
<subString found between pm.r._sp and pm.rm_ep>
/* This call to regexec finds the next match */
error = regexec (&re, pm.rm_ep, 1, &pm, REG_NOTBOL) ;