regexec 子例程

用途

Compares the null-terminated string 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子程序将 "字符串参数中的空尾字符串与之前调用 "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 参数中报告的子串:

  • If a subexpression in a regular expression participated in the match several times, the offset of the last matching substring is reported in the PMatch parameter.
  • 如果子未参与匹配,则PMatch参数中的字节偏移值为-1。 如果以下任何一项为 true ,那么子表达式不会参与匹配:
    • 在基本正则表达式中,子表达式后紧接着出现 *(星号)或 \{\}\}(反斜杠、左括号、反斜杠、右括号)。
    • An *(星号),? (问号)或{ }(左右括号)紧跟在扩展正则表达式中的子表达式之后,且子表达式不匹配(匹配 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标志的设置无关。
  • 模式参数中的 $(美元符号)用于指定表达式锚定时,会匹配紧接在String参数中换行符之前的零长度字符串,与REG_NOTEOL标志的设置无关。

参数

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

EFlags 参数修改对 字符串 参数的内容的解释。 它是以下 0 个或多个标记的位包容 OR,这些标记在regex.h文件中定义:

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

返回值

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

错误代码

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

描述
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 表示 ? (问号)、*(星号)或 +(加号),前面没有有效的基本正则表达式或扩展正则表达式。

如果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) ;